问题描述
我有一个用户表,其中有两列用于审批层次结构,表结构如下所示
User_ID Submit_to Approve_to
1 2 3
2 4 5
3 6 2
4 2 3
5 1 0
数据只是例如0
提及未批准者:
提交和批准都将是批准人
我需要一个查询,该查询可以按顺序提供批准者详细信息,即谁将为条目用户创建下一个批准者。
解决方法
使用CONNECT BY,可以在表中连接父/子关系。下面的查询将显示每个用户的批准路径。
查询
WITH
d (user_id,submit_to,approve_to)
AS
(SELECT 1,2,3 FROM DUAL
UNION ALL
SELECT 2,4,5 FROM DUAL
UNION ALL
SELECT 3,6,2 FROM DUAL
UNION ALL
SELECT 4,3 FROM DUAL
UNION ALL
SELECT 5,1,0 FROM DUAL)
SELECT d.user_id,LTRIM (SYS_CONNECT_BY_PATH (user_id,'<'),'<') AS approval_path
FROM d
START WITH approve_to = 0
CONNECT BY NOCYCLE PRIOR user_id = approve_to
ORDER BY user_id;
结果
在APPROVAL_PATH列中,最左边的数字是给出最终批准的USER_ID,最右边的数字是最初提交需要批准的内容的USER_ID。
USER_ID | APPROVAL_PATH
-----------------------
1 | 5<2<3<1
2 | 5<2
3 | 5<2<3
4 | 5<2<3<4
5 | 5