6

循環参照のある「楽しい」:

父親IDによってモデル化された要素の階層を含むテーブルELEMENTSがあるとします。

ルートの父親IDフィールドはnullです。

他のすべてのレコードには、父親要素の(自動シーケンスされた)主キー(ID)を持つnull以外の父親IDがあります。

たとえば、

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

無効な父親参照を持つすべての要素を見つけることができます(FATHER_ID外部キーではありません。この例ではそれを想定します)。

しかし、有効な父親参照を持っているが、父親参照のチェーンがルートで終わっていない要素をどのように見つけることができますか?これは循環参照でのみ発生する可能性があると思います。たとえば、AはBの父ですが、BもAの父です。このような「サブツリー」はルートにリンクされていないため、メインツリーの一部ではありません。そのようなサブツリーを見つけたいです。

もちろん、参照のチェーンがどれほど長くても、循環参照につながる要素を提供するクエリを探しています。

それはSQLで可能ですか、それとも反復的なソリューションが必要ですか?

4

1 に答える 1

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

あなたはこの記事を読みたいかもしれません:

于 2011-04-27T11:55:24.353 に答える