Để làm điều đó, hãy tham gia một bảng với các số nguyên, để mọi hàng nhân viên xảy ra thường xuyên khi có ID bộ phận trong chuỗi của nó nhưng ít nhất một lần. Đối với các hàng trong kết quả kết hợp là các số i đi từ 1 đến n , ở đâu n là số ID trong chuỗi cho nhân viên đó (nếu có bất kỳ ID bộ phận nào cho nhân viên đó). Sau đó, bạn có thể sử dụng REGEXP_SUBSTR()
để lấy số thứ _i từ chuỗi. Sử dụng điều đó để rời tham gia các phòng ban, để lấy tên phòng ban. Sau đó, sử dụng tổng hợp bằng LISTAGG()
để lấy lại một hàng cho từng nhân viên.
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;