Oracle
 sql >> база данни >  >> RDS >> Oracle

Рекурсия на заявка към база данни за получаване на йерархичен резултат с помощта на Hibernate - Java

Не правете рекурсивното търсене в Java. Това няма да се мащабира, защото ще изпращате партии на заявки към базата данни. Използвайте (единична) рекурсивна заявка директно в базата данни, която ще работи и ще мащабира много по-добре.

Не сте посочили вашата СУБД, но рекурсивните заявки се поддържат от всички съвременни бази данни. Следното е стандартен 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;

Пример:http://rextester.com/TJGTJ95905

Редактиране след разкриването на истинската база данни.

В Oracle имате два начина да направите това.

"Традиционният" начин е да използвате connect by което е много по-компактна форма на рекурсивна заявка от това, което създаде стандартът SQL:

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

Вие можете използвайте и общ табличен израз в Oracle. Въпреки това, въпреки че стандартът на SQL изисква ключовата дума recursive за да бъде задължително, Oracle избра да игнорира тази част от стандарта, така че трябва да я премахнете. LEVEL е псевдоколона в Oracle, която може да се използва само заедно с connect by така че това не може да се използва в 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Защо да използвате клауза JOIN срещу условие WHERE?

  2. ORACLE - Изберете Брой върху подзаявка

  3. В SQL какво означава използването на скоби с ИЛИ?

  4. Как да декларирам и използвам променливи в PL/SQL, както правя в T-SQL?

  5. Защо Oracle е толкова бавен, когато предам java.sql.Timestamp за колона DATE?