【问题标题】:Oracle Connect ByOracle 连接方式
【发布时间】:2017-06-30 14:35:35
【问题描述】:

这个问题与我之前的问题有些关系: Oracle SQL Connect By Logic

表:

create table temp (emp_id varchar2(3), manager_id varchar2(3))

数据:

E10 E20
E20 E50
E30 E50
E40 E40
E50 E90
E90 E90

我想创建一个查询以使用 connect by 向上查找父-父记录,而不是获取子记录。

解决办法:

Select EMP_ID 
from temp
     Start with EMP_ID = 'E20'
     Connect by  NOCYCLE  EMP_ID =  Prior MANAGER_ID
order by EMP_ID

但是,根据我的要求,我需要获取所有父母,并且上述查询在 E90 处停止。 [可能是因为 NOCYCLE 作为 E90 的 emp 和 manager 相同]。

查询输出:

E20
E50

所需输出:

E20
E50
E90

请指教。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    似乎周期是问题。

    通过查看 CONNECT BY 子句中带有 PRIOR 运算符的列来检测循环。

    要打破这样的循环,您需要添加一些非常正确但在其他列上使用 PRIOR 运算符的条件。

    例如:在您的 CONNECT BY 子句中添加

    and prior emp_id is not null
    

    (假设 emp_id 永远不能为空)。

    【讨论】:

    • @pOrinG mathguy 不会要求您删除 connect by,只需将其添加到您的连接查询中
    • 谢谢,它有效! @mathguy 但是我仍然无法理解它是如何工作的。假设我的循环到达 E50-E90,它将搜索 Emp_Id,其中 [prior] Manager_Id = E90 即 E90-E90。然后它将再次搜索 Emp_Id,其中 [prior] Manager_Id = E90 并且之前的 emp_id 仍应为 E90。我想我在这里遗漏了一些东西。
    • @Sudipta Mondal 谢谢。
    • @pOrinG - Oracle 为 CONNECT BY 生成的每一行创建较短的行以跟踪周期。用于跟踪周期的较短行仅包含具有 PRIOR 关键字的列。通过添加简单条件 PRIOR emp_id is not null,您可以强制 Oracle 在决定是否存在循环时除了 manager_id 之外还考虑 emp_id。这允许它在 (50, 90) 之后添加带有 (90, 90) 的行。如果它只看 manager_id 而不是 emp_id,它会认为这已经是一个循环了。
    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 2018-06-08
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2022-11-04
    相关资源
    最近更新 更多