Javaで再帰ルックアップを実行しないでください。 ロットを送信するため、スケーリングされません。 データベースへのクエリの。データベースで直接(単一の)再帰クエリを使用すると、パフォーマンスとスケーリングが大幅に向上します。
DBMSを指定していませんが、再帰クエリはすべての最新のデータベースでサポートされています。以下は、標準のANSISQLです。
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では、これを行うには2つの方法があります。
「従来の」方法は、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
は、connect by
と一緒にのみ使用できるOracleの疑似列です。 したがって、これは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