In Oracle 11.1 en hoger kunt u de UNPIVOT
. gebruiken exploitant. Als u een grote hoeveelheid gegevens heeft, zal dit een aanzienlijke verbetering van de uitvoeringstijd opleveren, omdat de tabel slechts één keer hoeft te worden gelezen, in plaats van drie keer met welke vorm van UNION ALL
dan ook. aanpak.
Ik heb de kolomnaam (in de uitvoer) gewijzigd van date
naar dt
aangezien DATE een gereserveerd woord is in Oracle. type
is niet veel beter (het is een trefwoord maar het is niet gereserveerd); het beste om het ook te vermijden. Ik heb je datums ook als tekenreeksen behandeld toen ik de testgegevens maakte, maar het werkt precies hetzelfde met datums.
De with
clausule maakt geen deel uit van de oplossing (kopieer en plak deze niet blindelings met de vraag); Ik heb het alleen voor testdoeleinden toegevoegd.
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