sql >> Database teknologi >  >> RDS >> Oracle

Rekursion på databaseforespørgsel for at få hierarkiske resultater ved hjælp af Hibernate - Java

Foretag ikke det rekursive opslag i Java. Det skaleres ikke, fordi du sender masser af forespørgsler til databasen. Brug en (enkelt) rekursiv forespørgsel direkte på databasen, som vil yde og skalere meget bedre.

Du har ikke angivet dit DBMS, men rekursive forespørgsler understøttes af alle moderne databaser. Følgende er standard 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;

Eksempel:http://rextester.com/TJGTJ95905

Rediger efter at den rigtige database blev afsløret.

I Oracle har du to måder at gøre det på.

Den "traditionelle" måde er at bruge connect by som er en meget mere kompakt form for en rekursiv forespørgsel end hvad SQL-standarden kom frem til:

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

Du kunne brug også et almindeligt tabeludtryk i Oracle. Men selvom SQL-standarden kræver nøgleordet recursive for at være obligatorisk, valgte Oracle at ignorere den del af standarden, så du er nødt til at fjerne den. LEVEL er en pseudo-kolonne i Oracle, der kun kan bruges sammen med connect by så dette kan ikke bruges i CTE-løsningen:

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. Kombiner to kolonner og tilføj til en ny kolonne

  2. Hvordan fungerer MySQL-indekser?

  3. Escape-funktion til regulære udtryk eller LIKE-mønstre

  4. phpMyBackupPro – Et webbaseret MySQL-sikkerhedskopieringsværktøj til Linux