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