За да направите това, присъединете се към таблица с цели числа, така че всеки ред за служител да се среща толкова често, колкото има идентификатори на отдели в неговия низ, но поне веднъж. За редовете в съединяването се получават числата i преминете от 1 към n , където n е броят на идентификаторите в низа за този служител (ако има идентификатори на отдел за служителя). След това можете да използвате REGEXP_SUBSTR()
за да получите _i_тото число от низа. Използвайте това, за да се присъедините към отделите отляво, за да получите името на отдела. След това използвайте агрегиране чрез LISTAGG()
за да получите отново един ред за всеки служител.
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;