sql >> Database >  >> RDS >> Oracle

haal ALLE kinderen op het laatste niveau (bladeren) van een knooppunt (hiërarchische vragen Oracle 11G)

Ik denk dat zoiets zou moeten werken:

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, en trouwens, je kunt alle bladeren krijgen zonder zelfs maar een hiërahische zoekopdracht te gebruiken. Selecteer gewoon alle knooppunten die niet het knooppunt van de vader zijn voor een knooppunt uit de relatietabel. Zoiets:

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

Om de bladknooppunten van het opgegeven knooppunt te krijgen, wijzigt u gewoon de voorwaarde in de START WITH-clausule, om de boom omgekeerd te starten vanaf het knooppunt waarin u bent geïnteresseerd. Deze query geeft u bijvoorbeeld alle onderliggende bladeren van het knooppunt met id =5 :

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


  1. Kolomalias in een WHERE-clausule

  2. JDBC-verbinding met Oracle Clustered

  3. Dubbele rijen verwijderen in een MySQL-database

  4. Hoe u de huidige weekgegevens in MySQL kunt krijgen