Oracle 11.1 और इसके बाद के संस्करण में, आप UNPIVOT
. का उपयोग कर सकते हैं ऑपरेटर। यदि आपके पास बड़ी मात्रा में डेटा है, तो यह निष्पादन समय में एक महत्वपूर्ण सुधार प्रदान करेगा, क्योंकि इसमें किसी भी प्रकार के UNION ALL
के साथ तालिका को तीन बार पढ़ने के बजाय केवल एक बार पढ़ने की आवश्यकता होती है। दृष्टिकोण।
मैंने date
. से कॉलम का नाम (आउटपुट में) बदल दिया है से dt
. तक चूंकि DATE Oracle में एक आरक्षित शब्द है। type
बहुत बेहतर नहीं है (यह एक कीवर्ड है लेकिन यह आरक्षित नहीं है); इससे बचना भी सबसे अच्छा है। जब मैंने परीक्षण डेटा बनाया था, तब भी मैंने आपकी तिथियों को स्ट्रिंग के रूप में माना था, लेकिन यह तिथियों के साथ ही काम करता है।
with
क्लॉज समाधान का हिस्सा नहीं है (इसे क्वेरी के साथ आँख बंद करके कॉपी और पेस्ट न करें); मैंने इसे केवल परीक्षण उद्देश्यों के लिए जोड़ा है।
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