我在甲骨文中有这种表
empid name deptid
1 a 1,2
2 b
3 c 1,2,3
我有如下部门表,
Deptid DeptName
1 IT
2 Finance
3 HR
我希望在选择语句中得到这样的结果,
empid name dept
1 a IT,Finance
2 b
3 c IT,Finance,HR
我在两个表中都有 1000+ 行,我是 pl\sql 的初学者,不知道该怎么做,请帮忙。
为此,请连接具有整数的表,以便每个员工行的出现频率与其字符串中的部门 ID 一样频繁,但至少出现一次。对于联接结果中的行,数字 i从 1 到 n,其中n是该员工的字符串中的 ID 数(如果该员工有任何部门 ID(。然后,您可以使用REGEXP_SUBSTR()
从字符串中获取_i_th数字。使用它向左加入部门,获取部门名称。然后使用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;
数据库<>小提琴