Trong Oracle 11.1 trở lên, bạn có thể sử dụng UNPIVOT nhà điều hành. Nếu bạn có một khối lượng lớn dữ liệu, điều này sẽ mang lại sự cải thiện đáng kể về thời gian thực thi, vì nó yêu cầu đọc bảng chỉ một lần, thay vì ba lần với bất kỳ loại UNION ALL nào cách tiếp cận.
Tôi đã thay đổi tên cột (trong đầu ra) từ date thành dt vì DATE là một từ dành riêng trong Oracle. type không tốt hơn nhiều (nó là một từ khóa nhưng nó không được bảo lưu); tốt nhất để tránh nó quá. Tôi cũng coi ngày tháng của bạn là chuỗi khi tôi tạo dữ liệu thử nghiệm, nhưng nó hoạt động giống như ngày tháng.
with mệnh đề không phải là một phần của giải pháp (đừng sao chép và dán nó một cách mù quáng với truy vấn); Tôi đã thêm nó chỉ với mục đích thử nghiệm.
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