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の複合キーがあり、この例からわかるように、親は通常、子の1つから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;

私が見たすべての例は、単純なキーを持つテーブルを参照しています。このような複合キーでは、はい、両方の列間の関係を指定する必要がありますが、2番目の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 に答える