SQL wählen Sie zyklische Referenzen im Vater-ID-organisierten Baum?
-
24-10-2019 - |
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?
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: