sql >> Databáze >  >> RDS >> Oracle

získat VŠECHNY děti poslední úrovně (listy) z uzlu (hierarhické dotazy Oracle 11G)

Myslím, že něco takového by mělo stačit:

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

Jo, a mimochodem, můžete získat všechny listy, aniž byste použili hierahický dotaz. Stačí vybrat všechny uzly, které nejsou otcovským uzlem pro žádný uzel z tabulky relací. Něco takového:

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

Chcete-li získat listové uzly ze zadaného uzlu, stačí změnit podmínku v klauzuli START WITH, aby se spustil zpětný chod stromu z uzlu, který vás zajímá. Například tento dotaz vám vrátí všechny podřízené listy uzlu s 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. Jak mohu získat data ze dvou tabulek

  2. Přihlášení ASP.NET selhalo pro uživatele 'NT AUTHORITY\NETWORK SERVICE'

  3. Jak používat výpisy připravené s CHOP s doložkou IN?

  4. Můžete definovat doslovné tabulky v SQL?