【问题标题】:connect by prior oracle通过先前的预言机连接
【发布时间】:2012-09-26 14:24:47
【问题描述】:

我有一个包含分层元素的表

表:

甲乙 P1 - P2 P1 C1 P2 C2 P2

B是来自同一张表的外键

查询是:

SELECT 级别 niveau, A 从表父,表子 从一个 IN 开始 ('P0','P1','C2') 由先前的 A = B 连接

结果

1个P1 1 P2 2 C1 2 C2 1个C2

为什么会出现“2 C2”?

想要的结果是尽管它不正确,我:

1个P1 1 P2 2 C1 1个C2

【问题讨论】:

  • 2 C2 出现是因为C2P2 的子级。

标签: oracle recursive-query connect-by


【解决方案1】:

将一个节点设置为根节点意味着它必须从一个节点开始然后它会为你工作我有同样的问题希望这对你有帮助

SELECT level niveau, A
from table parent, table child
START WITH A IN ='P1'
CONNECT BY PRIOR  A= B

【讨论】:

    【解决方案2】:

    Connect by 条件首先评估,start with 稍后评估。在您的情况下,C2 既是 P2 的子节点,又是层次结构的根节点。这就是它出现在您的结果中两次的原因。

    来自Oracle Documentaion

    Oracle 处理分层查询如下:

    如果存在连接,则首先评估连接,是否指定连接 在 FROM 子句中或带有 WHERE 子句谓词。

    评估 CONNECT BY 条件。

    评估任何剩余的 WHERE 子句谓词。

    Oracle 然后使用来自这些评估的信息来形成 层次结构使用以下步骤:

    Oracle 选择层次结构的根行——那些行 满足 START WITH 条件。

    Oracle 选择每个根行的子行。每个子行必须 满足关于一个的 CONNECT BY 条件的条件 的根行。

    Oracle 选择连续几代的子行。甲骨文优先 选择在步骤 2 中返回的行的子行,然后 那些孩子的孩子,等等。 Oracle 总是选择孩子 通过相对于电流评估 CONNECT BY 条件 父行。

    如果查询包含没有连接的 WHERE 子句,则 Oracle 从层次结构中消除所有不满足 WHERE 子句的条件。 Oracle 评估此条件 单独的每一行,而不是删除一行的所有孩子 不满足条件。

    Oracle 按图 9-1 所示的顺序返回行。在里面 图中,孩子出现在父母的下方。为了解释 层次树,

    【讨论】:

    • 你能把我的查询调整为想要的吗?
    • 是您的数据不正确,而不是您的查询:C2,P2 对应该去或替换为 (C2,null)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多