Oracle
 sql >> Base de données >  >> RDS >> Oracle

Recursion On Database Query pour obtenir un résultat hiérarchique en utilisant Hibernate - Java

Ne faites pas la recherche récursive en Java. Cela ne sera pas évolutif, car vous enverrez des lots de requêtes à la base de données. Utilisez une (seule) requête récursive directement sur la base de données qui sera beaucoup plus performante et évolutive.

Vous n'avez pas spécifié votre SGBD, mais les requêtes récursives sont prises en charge par toutes les bases de données modernes. Voici le SQL ANSI standard :

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;

Exemple :http://rextester.com/TJGTJ95905

Modifier après la divulgation de la vraie base de données.

Dans Oracle, vous avez deux façons de le faire.

La méthode "traditionnelle" consiste à utiliser connect by qui est une forme beaucoup plus compacte d'une requête récursive que ce que le standard SQL a proposé :

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

Vous pourriez utilisez également une expression de table commune dans Oracle. Cependant même si la norme SQL requiert le mot clé recursive pour être obligatoire, Oracle a choisi d'ignorer cette partie de la norme, vous devez donc la supprimer. LEVEL est une pseudo-colonne dans Oracle qui ne peut être utilisée qu'avec connect by cela ne peut donc pas être utilisé dans la solution 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