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