Untuk melakukan itu gabungkan tabel dengan bilangan bulat, sehingga setiap baris karyawan muncul sesering ada ID departemen dalam stringnya tetapi setidaknya satu kali. Untuk baris dalam hasil gabungan angka i pergi dari 1 ke n , di mana n adalah jumlah ID dalam string untuk karyawan tersebut (jika ada ID departemen untuk karyawan tersebut). Kemudian Anda dapat menggunakan REGEXP_SUBSTR()
untuk mendapatkan nomor _i_th dari string. Gunakan itu untuk pergi bergabung dengan departemen, untuk mendapatkan nama departemen. Kemudian gunakan agregasi menggunakan LISTAGG()
untuk mendapatkan satu baris lagi untuk setiap karyawan.
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;