Chcete-li to provést, připojte tabulku s celými čísly, aby se každý řádek zaměstnance vyskytoval tak často, jak jsou v řetězci ID oddělení, ale alespoň jednou. Pro řádky ve spojení jsou výsledkem čísla i přejít z 1 na n , kde n je počet ID v řetězci pro daného zaměstnance (pokud pro zaměstnance existují nějaká ID oddělení). Pak můžete použít REGEXP_SUBSTR()
získat _i_té číslo z řetězce. Použijte to k levému připojení k oddělením, abyste získali název oddělení. Poté použijte agregaci pomocí LISTAGG()
získat opět jeden řádek pro každého zaměstnance.
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;