/ / SQL SELECT, um zyklische Referenzen im von der Vater-ID organisierten Baum zu finden? - sql, oracle, cyclic-reference

SQL SELECT, um zyklische Verweise in der vom Vater-ID organisierten Struktur zu finden? - SQL, Oracle, zyklische Referenz

"Fun" mit zyklischen Referenzen:

Angenommen, ich habe eine Tabelle ELEMENTS, die eine Hierarchie von Elementen enthält, die von einer Vater-ID modelliert wird.

Das Vater-ID-Feld ist für den Stamm null.

Alle anderen Datensätze haben eine Vater-ID ungleich Null mit dem (automatisch geordneten) Primärschlüssel (ID) des Vaterelements.

Zum Beispiel mit

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

Ich kann alle Elemente finden, die ungültige Vaterreferenzen haben (FATHER_ID ist kein Fremdschlüssel, nehmen wir an, dass in diesem Beispiel).

Aber wie kann ich Elemente finden, die eine gültige Vaterreferenz haben, deren Kette von Vaterreferenzen nicht in der Wurzel endet? Ich denke, das kann nur für zyklische Referenzen passieren, zum Beispiel ist A der Vater von B, aber B ist auch der Vater von A. Ein solcher "Teilbaum" ist nicht an die Wurzel gebunden und somit nicht Teil des Hauptbaums. Ich möchte solche Teilbäume finden.

Natürlich bin ich auf der Suche nach einer Abfrage, die die Elemente liefert, die zu einer zyklischen Referenz führen, egal wie lang die Kette von Referenzen sein mag.

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

Antworten:

5 für die Antwort № 1
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

Vielleicht möchten Sie diesen Artikel lesen: