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

任意のノードを入力として指定した Oracle SQL の完全な階層

    ビューとして使用したい場合は、次のようにできます:

    WITH rek AS (SELECT item.id
                      , item.name
                      , connect_by_root item.id root_id
                   FROM item
                  START WITH parent_id IS null
                CONNECT BY NOCYCLE parent_id = PRIOR id)
    SELECT startItem.id startId
         , startItem.name startName
         , childItem.id childID
         , childItem.name childName
      FROM rek startItem
      JOIN rek childItem
      USING (root_id)
    -- WHERE startItem.id = 3 -- This would be done from outside the view
      

    サブクエリ rek ツリーのすべての兄弟をルート要素に接続します。次に、このクエリを 2 回使用し、ルート要素を介して接続するだけで、親子関係を介して接続されているすべての要素を取得できます。

    結果セットを減らしたい場合は、SYS_CONNECT_BY_PATH を使用できます そうするために:

    WITH rek AS (SELECT item.id
                      , item.name
                      , connect_by_root item.id root_id
                      , SYS_CONNECT_BY_PATH(item.id, '/') path
                   FROM item
                  START WITH parent_id IS null
                CONNECT BY NOCYCLE parent_id = PRIOR id)
    SELECT startItem.id startId
         , startItem.name startName
         , childItem.id childID
         , childItem.name childName
         , childItem.path 
      FROM rek startItem
      JOIN rek childItem
        ON startItem.root_id = childItem.root_id
        AND (startItem.path LIKE childItem.path||'/%'
          OR childItem.path LIKE startItem.path||'/%'
          OR childItem.id = startItem.id)
      

    たとえば、これにより、開始点の子と親のみが提供され、他のリーフからのエントリは提供されません。



    1. Mysql-インストーラーがエラーを表示しています:メモを書き込めませんでした

    2. TRY_CONVERT()がSQLServerでどのように機能するか

    3. PostgreSQLでサポートされているタイムゾーンのリストを返す

    4. Postgres CTE:非再帰的な用語で文字を変化させる(255)[]と入力しますが、全体的に文字を変化させる[]と入力します