sql >> Database >  >> RDS >> Oracle

Recursie op databasequery om hiërarchische resultaten te krijgen met Hibernate - Java

Doe de recursieve opzoeking niet in Java. Dat wordt niet geschaald omdat je veel gaat verzenden van zoekopdrachten naar de database. Gebruik een (enkele) recursieve query rechtstreeks op de database die veel beter zal presteren en schalen.

U heeft uw DBMS niet gespecificeerd, maar recursieve query's worden door alle moderne databases ondersteund. Het volgende is standaard 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;

Voorbeeld:http://rextester.com/TJGTJ95905

Bewerken nadat de echte database was onthuld.

In Oracle heb je twee manieren om dat te doen.

De "traditionele" manier is om connect by . te gebruiken wat een veel compactere vorm van een recursieve query is dan waar de SQL-standaard mee op de proppen kwam:

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

Je zou gebruik ook een algemene tabeluitdrukking in Oracle. Hoewel de SQL-standaard het trefwoord recursive vereist, om verplicht te zijn, koos Oracle ervoor om dat deel van de standaard te negeren, dus je moet het verwijderen. LEVEL is een pseudo-kolom in Oracle die alleen kan worden gebruikt in combinatie met connect by dus dit kan niet worden gebruikt in de CTE-oplossing:

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. Alleen-lezen Oracle Home

  2. Importeer 'xml' in SQL Server

  3. Hoe de MID()-functie werkt in MySQL

  4. Hoe Setseed() werkt in PostgreSQL