2012-03-14 28 views
2

我試圖選擇父級產品及其全部子級產品;如果你願意的話,爆炸物料清單(BoM)。這應該是一個簡單的任務,但我沒有得到預期的結果。Oracle CONNECT BY - 僅返回第一級項目

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 

..however,我只得到第一行(母公司)返回。

注意:該表具有part_no/serial_no的組合鍵,並且您可以從此示例中看到,父項通常會繼承其中一個子項的serial_no。我不確定這些問題是否會使問題複雜化,但顯然有些問題。

爲什麼我的查詢沒有深入到整個層次?

回答

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; 

所有的例子。隨着複合鍵像這樣,是的,我確實需要同時指定列之間的關係,但我還需要第二個現有關鍵字:

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

我的SQL是語法正確的,但不能用於查詢我想我正在運行!

1

我的猜測是,這限制了結果只有第一條記錄。

AND part_no    = 'ParentPart' 
+1

如果我刪除它,我會得到TWO 1級項目 - 真正的父級部分,以及共享相同的serial_no的子部分:'1 Serial1 ParentPart'和'1 Serial1 ChildPart1' – CJM 2012-03-14 11:53:27

+0

謝謝,我明白了。花了我一些時間來找到你的第一個查詢和你的第二個查詢之間的區別。保持缺少第二個先前的關鍵字... – Rene 2012-03-14 14:45:52

+0

np ...感謝對我有一個裂縫。 – CJM 2012-03-14 16:14:31