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

ノードからすべての最終レベルの子 (リーフ) を取得します (階層クエリ Oracle 11G)

    私は、そのようなことがトリックを行うべきだと思います:

    SELECT * FROM
    (SELECT n.id, n.val, CONNECT_BY_ISLEAF isleaf FROM NODES n 
           LEFT JOIN RELATION r ON n.id = r.id_child
    CONNECT BY PRIOR n.id = r.id_father
    START WITH r.id_father IS NULL)
    WHERE isleaf = 1
    

    ところで、階層クエリを使用しなくても、すべてのリーフを取得できます。リレーション テーブルから任意のノードに対して、親のノードではないすべてのノードを選択するだけです。そのようなもの:

    SELECT n.* FROM NODES n
    WHERE NOT EXISTS (SELECT ID_FATHER FROM RELATION r
                      WHERE r.id_father = n.id)
    

    指定したノードからリーフ ノードを取得するには、START WITH 句の条件を変更して、関心のあるノードから逆方向のツリーを開始します。たとえば、このクエリは、id =5 のノードのすべての子リーフを返します。 :

    SELECT * FROM
    (SELECT n.id, n.val, CONNECT_BY_ISLEAF isleaf FROM NODES n 
           LEFT JOIN RELATION r ON n.id = r.id_child
    CONNECT BY PRIOR n.id = r.id_father
    START WITH n.id = 5)
    WHERE isleaf = 1
    


    1. MySQL:ストアド関数を使用して文字列内の単語を並べ替える方法は?

    2. Oracleからデータをすばやく選択する方法

    3. xamppを使用してSQLサーバーをPHPに接続する方法は?

    4. 条件としてビット単位のAND(&)を使用したJPA @NamedQuery