sql >> Databasteknik >  >> RDS >> Oracle

få ALLA barn på sista nivån (blad) från en nod (hierariska frågor Oracle 11G)

Jag tycker att något sådant borde göra susen:

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

Åh, och förresten, du kan få alla blad utan att ens använda hierahical query. Välj bara alla noder, som inte är fadersnod för någon nod från relationstabellen. Något sådant:

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

För att få lövnoderna från den angivna noden, ändra bara villkoret i START WITH-satsen, för att starta trädet omvänt från den nod du är intresserad av. Till exempel kommer denna fråga att returnera alla underordnade löv av nod med 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. Optimerar SQL Server DATEADD-beräkningen i den valda frågan?

  2. mySQLi-array direkt till json-array

  3. Beräkna Max av summan av ett kommenterat fält över en grupperad efter fråga i Django ORM?

  4. SQL-gruppering efter månad och år