目前在我们的某个产品中,我们有一个逻辑查询,如下所述:
create table temp (emp_id varchar2(3), manager_id varchar2(3) )
数据:
E10 E20
E20 E50
E30 E50
E50 E90
查询:
select *
from Temp
Start with EMP_ID = 'E90'
Connect by Prior EMP_ID = MANAGER_ID and EMP_ID != MANAGER_ID
order by EMP_ID
我理解查询的概念[& connect by]我们需要获取指定员工的所有子记录,包括当前员工记录。我怀疑最后是否需要添加EMP_ID != MANAGER_ID
。
问题是为什么它被添加&在什么情况下它会有用[如果有的话]。
答案 0 :(得分:3)
最后一个条件不适用于您的数据,但避免无限递归非常重要。
为了说明这一点,请考虑如果在表中添加另一行会发生什么:
E40 E40
如果您从E40
而不是E90
开始,Oracle会在没有EMP_ID != MANAGER_ID
条件的情况下进入无限递归,因为E40
会连接回E40
请注意,编写此查询的更好方法是使用NOCYCLE
选项,而不是在显式检查中进行编码:
SELECT *
FROM Temp
START WITH EMP_ID = 'E90'
CONNECT BY NOCYCLE PRIOR EMP_ID = MANAGER_ID
ORDER BY EMP_ID