Verknüpfen Sie dazu eine Tabelle mit ganzen Zahlen, sodass jede Mitarbeiterzeile so oft vorkommt, wie Abteilungs-IDs in ihrer Zeichenfolge enthalten sind, aber mindestens einmal. Für die Zeilen im Join ergeben sich die Zahlen i gehe von 1 bis n , wobei n ist die Anzahl der IDs in der Zeichenfolge für diesen Mitarbeiter (falls es Abteilungs-IDs für den Mitarbeiter gibt). Dann können Sie REGEXP_SUBSTR()
verwenden um die _i_te Zahl aus der Zeichenfolge zu erhalten. Verwenden Sie dies, um den Abteilungen beizutreten, um den Abteilungsnamen zu erhalten. Verwenden Sie dann eine Aggregation mit LISTAGG()
um wieder eine einzelne Zeile für jeden Mitarbeiter zu erhalten.
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;