Para fazer isso, junte uma tabela com números inteiros, para que cada linha de funcionário ocorra com a mesma frequência que existem IDs de departamento em sua string, mas pelo menos uma vez. Para as linhas no resultado da junção, os números i vá de 1 a n , onde n é o número de IDs na string desse funcionário (se houver algum ID de departamento para o funcionário). Então você pode usar
REGEXP_SUBSTR()
para obter o _i_th número da string. Use isso para juntar os departamentos à esquerda, para obter o nome do departamento. Em seguida, use uma agregação usando LISTAGG()
para obter uma única linha para cada funcionário novamente. 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;
db<>fiddle