ऐसा करने के लिए पूर्णांकों वाली तालिका में शामिल हों, ताकि प्रत्येक कर्मचारी पंक्ति उतनी ही बार हो जितनी बार उसके स्ट्रिंग में विभाग आईडी हों लेकिन कम से कम एक बार। सम्मिलित परिणाम में पंक्तियों के लिए संख्याएँ i 1 से n . पर जाएं , जहां n उस कर्मचारी के लिए स्ट्रिंग में आईडी की संख्या है (यदि कर्मचारी के लिए कोई विभाग आईडी है)। फिर आप REGEXP_SUBSTR()
. का उपयोग कर सकते हैं स्ट्रिंग से _i_th नंबर प्राप्त करने के लिए। विभाग का नाम प्राप्त करने के लिए, विभागों में शामिल होने के लिए इसका उपयोग करें। फिर LISTAGG()
. का उपयोग करके एकत्रीकरण का उपयोग करें प्रत्येक कर्मचारी के लिए फिर से एक पंक्ति प्राप्त करने के लिए।
SELECT E.EMPID,
E.NAME,
E.DEPTID,
LISTAGG(D.DEPTNAME, ',') WITHIN GROUP (ORDER BY I.I) DEPTNAME
FROM EMPLOYEE E
LEFT JOIN (SELECT ROW_NUMBER() OVER (ORDER BY DEPTID) I
FROM DEPARTMENT) I
ON I.I <= REGEXP_COUNT(E.DEPTID, ',') + 1
LEFT JOIN DEPARTMENT D
ON D.DEPTID = TO_NUMBER(REPLACE(REGEXP_SUBSTR(',' || E.DEPTID, ',([[:digit:]]+)', 1, I.I), ',', ''))
GROUP BY E.EMPID,
E.NAME,
E.DEPTID;