W tym celu połącz tabelę z liczbami całkowitymi, tak aby każdy wiersz dotyczący pracownika występował tak często, jak w jego ciągu znajdują się identyfikatory działu, ale co najmniej jeden raz. Dla wierszy w wyniku łączenia liczby i przejdź od 1 do n , gdzie n to liczba identyfikatorów w ciągu dla tego pracownika (jeśli istnieją identyfikatory działu dla pracownika). Następnie możesz użyć REGEXP_SUBSTR()
aby uzyskać _i_tą liczbę z ciągu. Użyj tego, aby dołączyć do departamentów, aby uzyskać nazwę departamentu. Następnie użyj agregacji za pomocą LISTAGG()
aby ponownie uzyskać jeden wiersz dla każdego pracownika.
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;