Oracle SQL Connect By Logic

时间:2017-06-30 10:42:32

标签: sql oracle

目前在我们的某个产品中,我们有一个逻辑查询,如下所述:

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

问题是为什么它被添加&在什么情况下它会有用[如果有的话]。

1 个答案:

答案 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