2014-05-21 59 views
0

http://sqlfiddle.com/#!4/5f3b40/1CTE週期誤差

我有一個TABEL del

CMPI_CODE CMPI_ID_REF 
---------- ----------- 
     51    
     52   51 
     53    
     54    
     55    
     56    
     57    
     58    
     59    
     60    
     61    
     62    
     81    
     82   61 
     83    
     84    

-

WITH RSFC(A,B,LVL) AS 
    (SELECT CMPI_CODE,CMPI_ID_REF,0 AS LVL FROM del R where CMPI_ID_REF is null 
    UNION ALL SELECT A,B,LVL+1 FROM RSFC R 
    INNER JOIN DEL F ON R.A = F.CMPI_ID_REF 
) 
    select * from rsfc 

這就像是顯示錯誤SQL Error: ORA-32044: cycle detected while executing recursive WITH query

+0

你可以設置一個SQL小提琴顯示此錯誤? –

+0

http://sqlfiddle.com/#!4/5f3b40 – Nisar

回答

1

你似乎在選擇遞歸成員的錯誤值。只看前兩行,錨定成員將得到A, B, LVL,作爲51, null, 0。第一個遞歸成員將使用51來獲得第二行;但是你選擇A, B, LVL+1,這樣會得到51, null, 1。然後下一個會得到相同的...因此循環。所以你需要選擇:

UNION ALL SELECT F.CMPI_CODE,CMPI_ID_REF,LVL+1 FROM RSFC R 
    INNER JOIN DEL F ON R.A = F.CMPI_ID_REF 

SQL Fiddle根據你的。不知道這是否是你想要的最終結果。

0

Oracle沒有做分層查詢使用相同的語法a Sql服務器和WITH關鍵字旨在用於不同的用途。

做一個分層查詢使用下面的查詢:

SELECT DEL.*, level as LVL 
FROM 
    DEL 
CONNECT BY PRIOR 
    CMPI_CODE = CMPI_ID_REF 
START WITH 
    CMPI_ID_REF IS NULL; 
+4

Oracle *支持自11.2版以來的遞歸CTE(btw:遞歸CTE和'WITH'關鍵字對於SQL Server來說並不是特別的,它是由SQL標準定義的和許多現代數據庫管理系統支持) –

+0

而收到的錯誤消息似乎明確允許遞歸查詢(但由於顯而易見的原因不允許無限循環)。 –

+0

@a_horse_with_no_name哦,不知道,我的Oracle經驗看起來有點過時了,無論如何,我的查詢是一個解決事情的不同方法的建議。 –