2

我正在尝试选择一个父产品及其所有子产品;如果愿意,请分解物料清单 (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。我不确定这些问题中的任何一个是否会使事情复杂化,但显然有些地方出了问题。

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

4

2 回答 2

4

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

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 在语法上是正确的,但不是我认为我正在运行的查询!

于 2012-03-14T12:38:35.010 回答
1

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

AND part_no                = 'ParentPart'
于 2012-03-14T11:44:01.233 回答