2013-04-12 32 views
1

我有下表,它實現了一個鏈表。我想查詢以rate_sequence_id開頭的1,並獲得鏈接到它的下一條記錄,在這種情況下爲30。所以查詢應該返回兩行(1的rate_sequence_id和30)。在鏈接列表上的Oracle分層查詢表

但是,以下查詢要麼只返回1行,要麼會返回「循環」錯誤,具體取決於CONNECT BY子句中哪個列先到達。

正在嘗試用這些數據做什麼?

SELECT * FROM TEST 
CONNECT BY PRIOR RATE_SEQUENCE_ID = NEXT_RATE 
START WITH RATE_SEQUENCE_ID = 1 

測試數據:

CREATE TABLE TEST (
    RATE_SEQUENCE_ID  NUMBER(10,0), 
    NEXT_RATE    NUMBER(10,0), 
    DURATION    NUMBER, 
    RATE     NUMBER 
); 


Insert into TEST (RATE_SEQUENCE_ID,NEXT_RATE,DURATION,RATE) values (50,51,28,0.99); 
Insert into TEST (RATE_SEQUENCE_ID,NEXT_RATE,DURATION,RATE) values (51,51,112,9.99); 
Insert into TEST (RATE_SEQUENCE_ID,NEXT_RATE,DURATION,RATE) values (1,30,28,0.99); 
Insert into TEST (RATE_SEQUENCE_ID,NEXT_RATE,DURATION,RATE) values (30,30,112,14.99); 
Insert into TEST (RATE_SEQUENCE_ID,NEXT_RATE,DURATION,RATE) values (0,0,0,0); 
Insert into TEST (RATE_SEQUENCE_ID,NEXT_RATE,DURATION,RATE) values (31,0,30,0); 
+0

哪個版本的數據庫?分層查詢是Oracle在以後的版本中添加了大量功能的一個領域。 – APC

回答

1

因此,這是你的問題:

Insert into TEST (RATE_SEQUENCE_ID,NEXT_RATE,DURATION,RATE) values (30,30,112,14.99); 

30連接到自身。這是正確的還是一個錯字?

如果該數據是正確的並且您使用的是Oracle的現代版本,則可以使用NOCYCLE子句從循環中轉義。這絕對是10g(也許在9i中,我的記憶讓我失望)。 Find out more

SELECT * FROM TEST 
CONNECT BY NOCYCLE PRIOR RATE_SEQUENCE_ID = NEXT_RATE 
START WITH RATE_SEQUENCE_ID = 1 
+0

不是Typo。這意味着記錄是終端。但是,謝謝,這是非常有用的建議。我們正在使用11G – EdgeCase