For at gøre det skal du slutte dig til en tabel med heltal, så hver medarbejderrække forekommer lige så ofte, som der er afdelings-id'er i dens streng, men mindst én gang. For rækkerne i sammenføjningsresultatet er tallene i gå fra 1 til n , hvor n er antallet af id'er i strengen for den pågældende medarbejder (hvis der er afdelings-id'er for medarbejderen). Så kan du bruge REGEXP_SUBSTR()
for at få det _i_th tal fra strengen. Brug det til venstre at slutte sig til afdelingerne for at få afdelingsnavnet. Brug derefter en aggregering ved hjælp af LISTAGG()
at få en enkelt række til hver medarbejder igen.
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;