Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Recursion On Database Query para obter resultado hierárquico usando Hibernate - Java


Não faça a pesquisa recursiva em Java. Isso não será dimensionado porque você enviará lotes de consultas ao banco de dados. Use uma consulta recursiva (única) diretamente no banco de dados que terá um desempenho e uma escala muito melhores.

Você não especificou seu DBMS, mas as consultas recursivas são suportadas por todos os bancos de dados modernos. O seguinte é o padrão 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;

Exemplo:http://rextester.com/TJGTJ95905

Editar depois que o banco de dados real foi divulgado.

No Oracle você tem duas maneiras de fazer isso.

A maneira "tradicional" é usar connect by que é uma forma muito mais compacta de uma consulta recursiva do que o padrão SQL surgiu:
select child, level
from users
start with parent = 'Grandfather'
connect by prior child = parent
order by level desc;

Você poderia use uma expressão de tabela comum no Oracle também. No entanto, embora o padrão SQL exija a palavra-chave recursive para ser obrigatório, a Oracle optou por ignorar essa parte do padrão, então você tem que removê-lo. LEVEL é uma pseudo-coluna no Oracle que só pode ser usada em conjunto com connect by então isso não pode ser usado na solução 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