with a as (
select a.*, row_number() over (partition by department order by attributeID) rn
from attributes a),
e as (
select employeeId, department, attribute1, 1 rn from employees union all
select employeeId, department, attribute2, 2 rn from employees union all
select employeeId, department, attribute3, 3 rn from employees
)
select e.employeeId, a.attributeid, e.department, a.attribute, a.meaning,
e.attribute1 as value
from e join a on a.department=e.department and a.rn=e.rn
order by e.employeeId, a.attributeid
टेस्ट डेटा और आउटपुट:
create table employees (employeeID number(3), name varchar2(10), department varchar2(5), age number(3), attribute1 varchar2(10), attribute2 varchar2(10), attribute3 varchar2(10));
insert into employees values (1, 'john', 'IT', 22, 'attr1val1', 'attr2val2', null);
insert into employees values (2, 'jane', 'HR', 32, 'attr1val3', 'attr2val4', 'attr3val5');
insert into employees values (3, 'joe', 'HR', 23, 'attr1val6', 'attr2val7', 'attr3val8');
insert into employees values (4, 'jack', 'IT', 45, 'attr1val9', 'attr2val10', null);
create table attributes (attributeID number(3), department varchar2(10), attribute varchar2(10), meaning varchar2(10));
insert into attributes values (1, 'IT', 'attribute1', 'laptoptype');
insert into attributes values (2, 'IT', 'attribute2', 'networkloc');
insert into attributes values (3, 'HR', 'attribute1', 'location');
insert into attributes values (4, 'HR', 'attribute2', 'position');
insert into attributes values (5, 'HR', 'attribute3', 'allocation');
EMPLOYEEID ATTRIBUTEID DEPARTMENT ATTRIBUTE MEANING VALUE
---------- ----------- ---------- ---------- ---------- ----------
1 1 IT attribute1 laptoptype attr1val1
1 2 IT attribute2 networkloc attr2val2
2 3 HR attribute1 location attr1val3
2 4 HR attribute2 position attr2val4
2 5 HR attribute3 allocation attr3val5
3 3 HR attribute1 location attr1val6
3 4 HR attribute2 position attr2val7
3 5 HR attribute3 allocation attr3val8
4 1 IT attribute1 laptoptype attr1val9
4 2 IT attribute2 networkloc attr2val10
संपादित करें :स्पष्टीकरण
जवाब में मैंने इस्तेमाल किया>
समाधान को केवल पठनीय चरणों में विभाजित करने के लिए खंड। आप उन्हें से
. में ले जा सकते हैं मुख्य प्रश्न का खंड यदि यह आपके लिए अधिक सुविधाजनक है। वैसे भी:सबक्वेरी a
तालिका से डेटा पढ़ता है विशेषताएं
और पंक्तियों के लिए संख्या जोड़ता है, इसलिए प्रत्येक विभाग के लिए वे हमेशा 1 से गिने जाते हैं। मैंने row_number()
उस के लिए। सबक्वेरी ई
यूनियनों (सभी) को आवश्यक विशेषताएँ और उनके अनुसार संख्याएँ। दोनों उपश्रेणियों में उत्पन्न संख्याएँ तब मुख्य जुड़ाव में उपयोग की जाती हैं:a.department=e.department और a.rn=e.rn
।
वैकल्पिक 1 - यदि आप Oracle 11g का उपयोग कर रहे हैं तो आप unpivot
का उपयोग कर सकते हैं . देखें कि सबक्वेरी से क्या उत्पन्न होता है, और यह विशेषताओं
. के साथ कैसे जुड़ता है तालिका:
with e as (
select employeeId, name, department, attribute, value from employees
unpivot (value for attribute in ("ATTRIBUTE1", "ATTRIBUTE2", "ATTRIBUTE3"))
)
select e.employeeId, a.attributeid, e.department, a.attribute,
a.meaning, e.value
from e join attributes a on a.department=e.department
and lower(a.attribute)=lower(e.attribute)
order by e.employeeId, a.attributeid;
वैकल्पिक 2 - पदानुक्रमित सबक्वेरी जनरेटर के साथ (सबक्वेरी r
), कनेक्ट बाय
द्वारा साकार किया गया
कौन सा सरल 1, 2, 3 से नंबर बनाता है जो आगे कर्मचारियों
. के साथ जुड़ जाते हैं और उचित विशेषता मामले
में मान के रूप में संलग्न है खंड। बाकी मूल उत्तर की तरह ही बनाया गया है।
with a as (
select a.*, row_number() over (partition by department order by attributeID) rn
from attributes a),
r as (select level rn from dual connect by level<=3),
e as (
select employeeId, department, rn,
case when r.rn = 1 then attribute1
when r.rn = 2 then attribute2
when r.rn = 3 then attribute3
end value
from employees cross join r
)
select e.employeeId, a.attributeid, e.department, a.attribute,
a.meaning, e.value
from e join a on a.department=e.department and a.rn=e.rn
order by e.employeeId, a.attributeid
तीनों संस्करणों ने मुझे एक ही आउटपुट दिया। मैंने 100k पंक्तियों के साथ समान तालिका पर पहले विकल्प का भी परीक्षण किया और कुछ सेकंड (5 विशेषताओं के लिए) में आउटपुट प्राप्त किया। कृपया सभी समाधानों का परीक्षण करें और उन्हें समझने का प्रयास करें। यदि आप बिना धुरी के संस्करण का उपयोग कर सकते हैं तो मैं इसे पसंद करूंगा। विलंबित स्पष्टीकरण और किसी भी भाषा की गलतियों के लिए क्षमा करें।