sql >> Databasteknik >  >> RDS >> Oracle

Rekursion på databasfråga för att få hierarkiska resultat med Hibernate - Java

Gör inte den rekursiva sökningen i Java. Det kommer inte att skalas eftersom du kommer att skicka massor av frågor till databasen. Använd en (enkel) rekursiv fråga direkt på databasen som kommer att prestera och skala mycket bättre.

Du angav inte din DBMS men rekursiva frågor stöds av alla moderna databaser. Följande är 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;

Exempel:http://rextester.com/TJGTJ95905

Redigera efter att den verkliga databasen avslöjades.

I Oracle har du två sätt att göra det.

Det "traditionella" sättet är att använda connect by vilket är en mycket mer kompakt form av en rekursiv fråga än vad SQL-standarden kom fram till:

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

Du kunde använd ett vanligt tabelluttryck i Oracle också. Men även om SQL-standarden kräver nyckelordet recursive för att vara obligatorisk valde Oracle att ignorera den delen av standarden, så du måste ta bort den. LEVEL är en pseudo-kolumn i Oracle som endast kan användas tillsammans med connect by så detta kan inte användas 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. Fråga efter MySQL:s INFORMATIONSSCHEMA:Varför? På vilket sätt?

  2. Hur utför man en urvalsfråga i ett DO-block?

  3. UNION ALL Optimering

  4. Ta bort konstiga tecken (A med hatt) från SQL Server varchar-kolumnen