Oracle
 sql >> Baza danych >  >> RDS >> Oracle

pobierz WSZYSTKIE dzieci (liści) ostatniego poziomu z węzła (zapytania hierarchiczne Oracle 11G)

Myślę, że coś takiego powinno wystarczyć:

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

A tak przy okazji, możesz uzyskać wszystkie liście bez użycia zapytań hierarchicznych. Wystarczy zaznaczyć wszystkie węzły, które nie są węzłem ojca dla dowolnego węzła z tabeli relacji. Coś takiego:

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

Aby pobrać węzły liściowe z określonego węzła, wystarczy zmienić warunek w klauzuli START WITH, aby rozpocząć odwracanie drzewa od węzła, który Cię interesuje. Na przykład to zapytanie zwróci Ci wszystkie liście potomne węzła o 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uzyskaj DŁUGOŚĆ DŁUGICH RAW

  2. BadImageFormatException podczas korzystania z 64-bitowego klienta Oracle i Visual Studio 2010!

  3. Odejmowanie znacznika czasu w Oracle zwraca dziwne dane

  4. Jak używać słowa kluczowego „as” do aliasowania tabeli w Oracle?

  5. Jak mogę wybrać 10, 20, 30 ... wiersz wyniku innego zapytania wybierającego?