Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

UNION zum Kreuzen von Spalten einer Tabelle

Dieses Thema im Forum "PostgreSQL" wurde erstellt von Tom.S, 28 August 2015.

  1. Tom.S

    Tom.S Fleissiger Benutzer

    Bei mir tritt ein komisches Problem mit Union auf:
    Ich habe eine Tabelle
    Code:
    | id | per_1 | per_2 |
      1      5       2
      2      5       3
    
    und möchte jetzt eine Abfrage haben, die mir die per Fremdschlüssel aus Spalte per_1 und per_2 untereinander auflistet:
    Code:
    | id | per_1 | per_2 |
      1      5        2
      2      5        3
      1      2        5
      2      3        5
    
    Meine Abfrage
    Code:
    SELECT row_number() OVER() AS ida,*
    
    FROM
        (
           SELECT
                          id,      
                          per_1 AS p1,
                          per_2 AS p2
          FROM
                         table
    UNION ALL
           SELECT
                          id,      
                          per_1 AS p2,
                          per_2 AS p1
          FROM
                         table
    ) AS sub
    gibt mir aber nicht das erhoffte Ergebnis, sondern ignoriert die Alias und verdoppelt einfach die Zeilen:
    Code:
    ida | id | p_1 | p_2 |
    1      1     5    2
    2      2     5    3
    3      1     5    2
    4      2     5    3
    
    Mein nahe liegender Gedanke, dass das Problem mit der Uneindeutigkeit der Zeilen zusammenhängt, weil die PK ja verdoppelt sind, hat sich als erfolglose Spur erwiesen. Auch kompliziertere Teilquerys, wo noch eindeutige Spalten mit eindeutigen Werten beigefügt wurden, ändert an dem Problem nichts.
     
    Zuletzt bearbeitet: 28 August 2015
  2. akretschmer

    akretschmer Datenbank-Guru

    Code:
    test=*# select * from toms ;
     id | per_1 | per_2
    ----+-------+-------
      1 |  5 |  2
      2 |  5 |  3
    (2 rows)
    
    Time: 0,169 ms
    test=*# select id, per_1, per_2 from toms union all select id, per_2, per_1 from toms ;
     id | per_1 | per_2
    ----+-------+-------
      1 |  5 |  2
      2 |  5 |  3
      1 |  2 |  5
      2 |  3 |  5
    (4 rows)
    
    row_number() dazuzudingsen überlasse ich Dir zur Übung ;-)
     
  3. Distrilec

    Distrilec Datenbank-Guru

    Vllt. etwas Erklärung:
    Union nach Definition kümmert sich NICHT um die Reihenfolge der Spalten... Selbst wenn du Sie passend benamst...
    Code:
    SELECT row_number() OVER() AS ida,*
    FROM
        (
           SELECT
                          id,    
                          per_1 AS p1,
                          per_2 AS p2
          FROM
                         table
    UNION ALL
           SELECT
                          id,    
                          per_1 AS p2,
                          per_2 AS p1
          FROM
                         table
    ) AS sub
    Alles was Union macht ist die Werte 1:1 untereinander zu bringen (also wie bei dir id, per_1, per_2 + id, per_1, per_2) und im nachhinein die Spalte so zu benennen wie die Spalte des ersten Selects...

    Also musst du nur im zweiten Statement die Spalten per_1 und per_2 vertauschen (was @akretschmer ja schon getan hat :) )
     
  4. Tom.S

    Tom.S Fleissiger Benutzer

    lol Danke für Eure Antworten. Ahnte ich doch, dass das Problem eher vor dem Rechner saß. Aber die Funktionsweise von UNION hatte ich bisher echt falsch verstanden.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden