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

Recursion On Database Query k získání hierarchického výsledku pomocí Hibernate - Java

Neprovádějte rekurzivní vyhledávání v Javě. To se nezmění, protože budete posílat množství dotazů do databáze. Použijte (jediný) rekurzivní dotaz přímo na databázi, který bude fungovat a škálovat mnohem lépe.

Nezadali jste svůj DBMS, ale rekurzivní dotazy jsou podporovány všemi moderními databázemi. Následuje standardní ANSI SQL:

with recursive ancestry as (
   select child, parent, 1 as level
   from users
   where parent = 'Grandfather' -- this is the one who logs in
   union all
   select c.child, c.parent, p.level + 1
   from users c
     join ancestry p on p.child = c.parent
)
select child, level
from ancestry
order by level desc;

Příklad:http://rextester.com/TJGTJ95905

Upravit poté, co byla odhalena skutečná databáze.

V Oracle to můžete udělat dvěma způsoby.

"Tradičním" způsobem je použití connect by což je mnohem kompaktnější forma rekurzivního dotazu než to, s čím přišel standard SQL:

select child, level
from users
start with parent = 'Grandfather'
connect by prior child = parent
order by level desc;

Mohli byste používat běžný tabulkový výraz i v Oracle. I když však standard SQL vyžaduje klíčové slovo recursive aby byla povinná, Oracle se rozhodl tuto část standardu ignorovat, takže ji musíte odstranit. LEVEL je pseudosloupec v Oracle, který lze použít pouze společně s connect by takže to nelze použít v řešení CTE:

with ancestry (child, parent, lvl) as (
   select child, parent, 1 as lvl
   from users
   where parent = 'Grandfather'
   union all
   select c.child, c.parent, p.lvl + 1
   from users c
     join ancestry p on p.child = c.parent
)
select child, lvl
from ancestry
order by lvl desc



  1. Jak ručně nakonfigurovat server Glassfish v Eclipse

  2. Příkaz SQL CASE

  3. Nelze se připojit k Postgres přes PHP, ale lze se připojit z příkazového řádku a PgAdmin na jiném počítači

  4. Rozdělte čárkami oddělené hodnoty sloupce v řádku pomocí dotazu Oracle SQL