sql >> データベース >  >> RDS >> Oracle

Hibernateを使用して階層結果を取得するためのデータベースクエリの再帰-Java

    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
    



    1. MyISAMとInnoDBをいつ使用するのですか?

    2. MySQLの既存のテーブルに自動インクリメント列を追加する方法

    3. ClusterControlCLIからPostgreSQLデータベースを管理する方法

    4. SQLServerテーブルの既存の列にデフォルトの制約を追加する方法-SQLServer/TSQLチュートリアルパート91