In Oracle 11.1 und höher können Sie UNPIVOT
verwenden Operator. Wenn Sie über ein großes Datenvolumen verfügen, führt dies zu einer erheblichen Verbesserung der Ausführungszeit, da die Tabelle nur einmal gelesen werden muss, anstatt dreimal mit jeder Art von UNION ALL
Ansatz.
Ich habe den Spaltennamen (in der Ausgabe) von date
geändert zu dt
da DATE ein reserviertes Wort in Oracle ist. type
ist nicht viel besser (es ist ein Schlüsselwort, aber es ist nicht reserviert); am besten auch vermeiden. Ich habe Ihre Daten auch als Zeichenfolgen behandelt, als ich die Testdaten erstellt habe, aber es funktioniert genauso mit Daten.
Der with
-Klausel ist nicht Teil der Lösung (kopieren Sie sie nicht blind und fügen Sie sie mit der Abfrage ein); Ich habe es nur zu Testzwecken hinzugefügt.
with
test_data ( ID, VT_Type1, Vt_type2, VT_Type3, Status_1, Status_2, Status_3,
Date_1, Date_2, Date_3 ) as (
select 1, -1, -1, 0, 'X', 'Y', 'Z', '04/12', '05/12', '06/12' from dual union all
select 2, -1, -1, -1, 'A', 'B', 'C', '06/12', '07/12', '07/10' from dual
)
select id, type, status, dt
from test_data
unpivot ( (vt_type, status, dt) for type in ( (vt_type1, status_1, date_1) as 1,
(vt_type2, status_2, date_2) as 2,
(vt_type3, status_3, date_3) as 3
)
)
where vt_type != 0
;
ID TYPE STATUS DT
-- ---- ------ -----
1 1 X 04/12
1 2 Y 05/12
2 1 A 06/12
2 2 B 07/12
2 3 C 07/10