これを行うには、整数を使用してテーブルを結合します。これにより、すべての従業員の行は、文字列に部門IDがあるのと同じ頻度で発生しますが、少なくとも1回は発生します。結合結果の行の場合、番号 i 1からnに移動します 、ここで n その従業員の文字列内のIDの数です(従業員の部門IDがある場合)。次に、REGEXP_SUBSTR()
を使用できます 文字列から_i_番目の数値を取得します。これを使用して、部門に左参加し、部門名を取得します。次に、LISTAGG()
を使用して集計を使用します 従業員ごとに1行を再度取得します。
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;