Di Oracle 11.1 dan di atasnya, Anda dapat menggunakan UNPIVOT
operator. Jika Anda memiliki volume data yang besar, ini akan memberikan peningkatan yang signifikan dalam waktu eksekusi, karena hanya perlu membaca tabel satu kali, bukan tiga kali dengan jenis UNION ALL
apa pun. pendekatan.
Saya mengubah nama kolom (di output) dari date
ke dt
karena DATE adalah kata yang dicadangkan di Oracle. type
tidak jauh lebih baik (ini adalah kata kunci tetapi tidak dicadangkan); sebaiknya hindari juga. Saya juga memperlakukan tanggal Anda sebagai string ketika saya membuat data pengujian, tetapi cara kerjanya sama dengan tanggal.
with
klausa bukan bagian dari solusi (jangan salin dan tempel secara membabi buta dengan kueri); Saya menambahkannya hanya untuk tujuan pengujian.
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