Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Holen Sie sich ALLE Kinder der letzten Ebene (Blätter) von einem Knoten (hierarchische Abfragen Oracle 11G)

Ich denke, so etwas sollte ausreichen:

SELECT * FROM
(SELECT n.id, n.val, CONNECT_BY_ISLEAF isleaf FROM NODES n 
       LEFT JOIN RELATION r ON n.id = r.id_child
CONNECT BY PRIOR n.id = r.id_father
START WITH r.id_father IS NULL)
WHERE isleaf = 1

Oh, und übrigens, Sie können alle Blätter erhalten, ohne auch nur eine hierahische Abfrage zu verwenden. Wählen Sie einfach alle Knoten, die nicht der Vaterknoten sind, für einen beliebigen Knoten aus der Beziehungstabelle aus. Etwas in der Art:

SELECT n.* FROM NODES n
WHERE NOT EXISTS (SELECT ID_FATHER FROM RELATION r
                  WHERE r.id_father = n.id)

Um die Blattknoten vom angegebenen Knoten zu erhalten, ändern Sie einfach die Bedingung in der START WITH-Klausel, um den Baum rückwärts von dem Knoten zu starten, an dem Sie interessiert sind. Diese Abfrage gibt Ihnen beispielsweise alle untergeordneten Blätter des Knotens mit der ID =5 zurück :

SELECT * FROM
(SELECT n.id, n.val, CONNECT_BY_ISLEAF isleaf FROM NODES n 
       LEFT JOIN RELATION r ON n.id = r.id_child
CONNECT BY PRIOR n.id = r.id_father
START WITH n.id = 5)
WHERE isleaf = 1