Pour ce faire, joignez une table avec des nombres entiers, de sorte que chaque ligne d'employé se produise aussi souvent qu'il y a d'ID de service dans sa chaîne, mais au moins une fois. Pour les lignes du résultat de la jointure, les nombres i passer de 1 à n , où n est le nombre d'ID dans la chaîne pour cet employé (s'il existe des ID de service pour l'employé). Ensuite, vous pouvez utiliser REGEXP_SUBSTR()
pour obtenir le _i_ème nombre de la chaîne. Utilisez-le pour joindre à gauche les départements, pour obtenir le nom du département. Utilisez ensuite une agrégation en utilisant LISTAGG()
pour obtenir à nouveau une seule ligne pour chaque employé.
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;