Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Rekursion auf Datenbankabfrage, um hierarchisches Ergebnis mit Hibernate - Java zu erhalten

Führen Sie die rekursive Suche nicht in Java durch. Das wird nicht skaliert, weil Sie Lots senden werden von Anfragen an die Datenbank. Verwenden Sie eine (einzelne) rekursive Abfrage direkt in der Datenbank, die eine viel bessere Leistung und Skalierung bietet.

Sie haben Ihr DBMS nicht angegeben, aber rekursive Abfragen werden von allen modernen Datenbanken unterstützt. Folgendes ist 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;

Beispiel:http://rextester.com/TJGTJ95905

Bearbeiten nachdem die echte Datenbank offengelegt wurde.

In Oracle haben Sie zwei Möglichkeiten, dies zu tun.

Der "traditionelle" Weg ist die Verwendung von connect by Dies ist eine viel kompaktere Form einer rekursiven Abfrage als der SQL-Standard:

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

Sie könnten Verwenden Sie auch in Oracle einen gemeinsamen Tabellenausdruck. Allerdings verlangt der SQL-Standard das Schlüsselwort recursive obligatorisch zu sein, hat Oracle diesen Teil des Standards ignoriert, also müssen Sie ihn entfernen. LEVEL ist eine Pseudo-Spalte in Oracle, die nur zusammen mit connect by verwendet werden kann daher kann dies nicht in der CTE-Lösung verwendet werden:

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