sql >> Base de Datos >  >> RDS >> Oracle

Recursión en la consulta de la base de datos para obtener un resultado jerárquico usando Hibernate - Java

No haga la búsqueda recursiva en Java. Eso no escalará porque enviarás muchos de consultas a la base de datos. Use una consulta recursiva (única) directamente en la base de datos que funcionará y escalará mucho mejor.

No especificó su DBMS, pero todas las bases de datos modernas admiten consultas recursivas. Lo siguiente es ANSI SQL estándar:

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;

Ejemplo:http://rextester.com/TJGTJ95905

Editar después de que se revelara la base de datos real.

En Oracle tienes dos formas de hacerlo.

La forma "tradicional" es usar connect by que es una forma mucho más compacta de una consulta recursiva que la que se le ocurrió al estándar SQL:

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

podrías use una expresión de tabla común en Oracle también. Sin embargo, aunque el estándar SQL requiere la palabra clave recursive Al ser obligatorio, Oracle optó por ignorar esa parte del estándar, por lo que hay que eliminarlo. LEVEL es una pseudocolumna en Oracle que solo se puede usar junto con connect by entonces esto no se puede usar en la solución 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