我在Oracle中有这种表
empid name deptid
1 a 1,2
2 b
3 c 1,2,3
我的部门表如下,
Deptid DeptName
1 IT
2 Finance
3 HR
我希望在select语句中得到这样的结果
empid name dept
1 a IT,Finance
2 b
3 c IT,Finance,HR
两个表中都有1000多个行,我是pl \ sql的初学者,不知道该怎么做,请帮忙。
答案 0 :(得分:0)
为此,将一个表与整数连接起来,以便每个员工行的出现频率与其字符串中的部门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;