UNION zum Kreuzen von Spalten einer Tabelle

Tom.S

Fleissiger Benutzer
Beiträge
62
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:
Werbung:
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 ;-)
 
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 :) )
 
Werbung:
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.
 
Zurück
Oben