Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Rekursi Pada Query Database untuk mendapatkan hasil hierarkis menggunakan Hibernate - Java

Jangan lakukan pencarian rekursif di Jawa. Itu tidak akan diskalakan karena Anda akan mengirim banyak dari query ke database. Gunakan kueri rekursif (tunggal) langsung di database yang akan berkinerja dan menskalakan jauh lebih baik.

Anda tidak menentukan DBMS Anda tetapi kueri rekursif didukung oleh semua database modern. Berikut ini adalah standar 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;

Contoh:http://rextester.com/TJGTJ95905

Sunting setelah database yang sebenarnya diungkapkan.

Di Oracle Anda memiliki dua cara untuk melakukan itu.

Cara "tradisional" adalah dengan menggunakan connect by yang merupakan bentuk kueri rekursif yang jauh lebih ringkas daripada standar SQL yang dibuat:

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

Anda bisa gunakan ekspresi tabel umum di Oracle juga. Namun meskipun standar SQL membutuhkan kata kunci recursive untuk menjadi wajib, Oracle memilih untuk mengabaikan bagian standar itu, jadi Anda harus menghapusnya. LEVEL adalah kolom semu di Oracle yang hanya dapat digunakan bersama dengan connect by jadi ini tidak dapat digunakan dalam solusi 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. Oracle 11g - Tanpa Pivot

  2. Metode Pengumpulan:Fungsi EXISTS Di Oracle Database

  3. INST_TOP (Oracle R12 INSTANCE_HOME ) diterjemahkan

  4. Bagaimana cara menjatuhkan tabel di oracle

  5. Cara mematikan semua sesi Oracle aktif dan tidak aktif untuk pengguna