【问题标题】:Oracle CONNECT BY - only returning first level itemOracle CONNECT BY - 仅返回第一级项目
【发布时间】:2012-03-14 20:38:35
【问题描述】:

我正在尝试选择一个父产品及其所有子产品;如果愿意,请分解物料清单 (BoM)。这应该是一个足够简单的任务,但我没有得到预期的结果。

SELECT LEVEL,
   serial_no,
   part_no
FROM ifsapp.part_serial_catalog_tab
   START WITH serial_no       = 'Serial1'
   AND part_no                = 'ParentPart'
   CONNECT BY PRIOR serial_no = superior_serial_no
   AND part_no                = superior_part_no;

我希望看到以下结果:

1 Serial1 ParentPart
2 Serial1 ChildPart1
2 Serial2 ChildPart2

..但是,我只返回了第一行(父行)。

注意:该表有一个复合键 part_no/serial_no,从这个例子中可以看出,父表通常从其中一个孩子那里继承 serial_no。我不确定这些问题中的任何一个是否会使事情复杂化,但显然有些地方出了问题。

为什么我的查询没有深入到整个层次结构?

【问题讨论】:

    标签: oracle oracle11g connect-by


    【解决方案1】:

    一位同事帮我解决了问题:

    SELECT LEVEL,
       serial_no,
       part_no
    FROM ifsapp.part_serial_catalog_tab
       START WITH serial_no       = 'Serial1'
       AND part_no                = 'ParentPart'
       CONNECT BY PRIOR serial_no = superior_serial_no
       AND PRIOR part_no          = superior_part_no;
    

    我见过的所有示例都指的是带有简单键的表。使用这样的复合键,是的,我确实需要指定两列之间的关系,但我还需要第二个 PRIOR 关键字:

       CONNECT BY PRIOR serial_no = superior_serial_no
       AND PRIOR part_no          = superior_part_no;
    

    我的 SQL 在语法上是正确的,但不是我认为我正在运行的查询!

    【讨论】:

      【解决方案2】:

      我的猜测是,这会将结果限制为仅第一条记录。

      AND part_no                = 'ParentPart'
      

      【讨论】:

      • 如果我删除它,我会得到两个 1 级项目 - 真正的父部分和共享相同序列号的子部分:1 Serial1 ParentPart1 Serial1 ChildPart1
      • 谢谢,我明白了。我花了一些时间来找出您的第一个查询和第二个查询之间的区别。一直缺少第二个先前的关键字...
      猜你喜欢
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多