2011-04-27 91 views
6

帶有循環引用的「趣味」:SQL SELECT在父-ID組織樹中查找循環引用?

假設我有一個表ELEMENTS,它包含由父ID建模的元素層次結構。

父標識字段對於根爲空。

所有其他記錄具有父元素的(自動定序的)主鍵(ID)的非空父標識。

例如,使用

SELECT * 
FROM Elements 
WHERE FATHER_ID not in (SELECT ID FROM Elements) 

我能找到具有無效父親引用的所有元素(FATHER_ID不是一個外鍵,讓我們假設在這個例子中)。

但我怎麼能發現確實有一個有效的父親引用,但他的父親引用鏈中的根並沒有結束元素?我認爲這隻能發生在循環引用中,例如A是B的父親,但B也是A的父親。這種「子樹」沒有鏈接到根,因此不是主樹的一部分。 我想找到這樣的子樹。

當然,我期待的,提供那些導致循環引用無論多久引用鏈可以是元素的查詢。

這是SQL中可能的,還是我需要一個迭代解決方案?

回答

5
SELECT n.*, CONNECT_BY_ROOT(id), level 
FROM elements n 
START WITH 
     id IN 
     (
     SELECT MIN(id) 
     FROM (
       SELECT id, CONNECT_BY_ROOT(id) AS root 
       FROM elements 
       START WITH 
         id IN 
         (
         SELECT id 
         FROM elements n 
         WHERE CONNECT_BY_ISCYCLE = 1 
         CONNECT BY NOCYCLE 
           father_id = PRIOR id 
         ) 
       CONNECT BY NOCYCLE 
         id = PRIOR father_id 
       ) 
     GROUP BY 
       root 
     ) 
CONNECT BY NOCYCLE 
     id = PRIOR father_id 

您可能需要閱讀這篇文章:

+0

+1使用CONNECT BY的。使用分層數據可以完成各種各樣的偉大事情。請注意,它僅限於Oracle。在11gR2中他們增加了遞歸子查詢分解條款(http://technology.amis.nl/blog/6104/oracle-rdbms-11gr2-goodbye-connect-by-or-the-end-of-hierarchical-querying-as-我們知道它) – 2011-04-27 12:02:02

+0

奧哈。這看起來像是可以攪動的東西,並且值得。謝謝。 – TheBlastOne 2011-04-27 12:20:30