Frage

"Spaß" mit zyklischen Referenzen:

Angenommen, ich habe eine Tabellenelemente, die eine Hierarchie von Elementen enthalten, die von einer Vater -ID modelliert werden.

Das Vater -ID -Feld ist null für die Wurzel.

Alle anderen Aufzeichnungen haben eine Nicht-Null-Vater-ID mit dem (automatisierten) Primärschlüssel (ID) des Vaterelements.

Zum Beispiel verwenden

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

Ich kann alle Elemente finden, die ungültige Vaterreferenzen haben (Referenzen "(FATHER_ID ist kein fremder Schlüssel, nehmen wir das in diesem Beispiel an.

Aber wie kann ich Elemente finden, die eine gültige Vaterreferenz haben, aber deren Kette von Vaterreferenzen nicht in der Wurzel endet? Ich denke, dies kann nur bei zyklischen Referenzen passieren, zum Beispiel ist A der Vater von B, aber B ist auch der Vater von A. Ein solcher "Subtree" ist nicht mit der Wurzel verbunden und ist daher nicht Teil des Hauptbaums. Ich möchte solche Unterbälde finden.

Natürlich suche ich nach einer Abfrage, die die Elemente liefert, die zu einer zyklischen Referenz führen, unabhängig davon, wie lange die Referenzkette dauern kann.

Ist das in SQL möglich oder brauche ich eine iterative Lösung?

War es hilfreich?

Lösung

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

Möglicherweise möchten Sie diesen Artikel lesen:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top