0

「test」というテーブルがあります。親列と子列が含まれています。

Parent  Child
  1      101
  1      102
  1      103
 101     121
 101     123
 103     133
 121     80
 121     81

ここで、指定された「1」値のすべての子/親を取得するクエリを作成しました。

( SELECT parent,child,LEVEL FROM TEST
    START WITH child= 1
    CONNECT BY PRIOR parent=child) 
UNION ALL
   (SELECT parent,child,LEVEL FROM TEST
      START WITH parent=1
      CONNECT BY PRIOR child=parent)
      ORDER BY parent

しかし、指定された値に関係なく、その階層内のすべての子/親が必要です..つまり、「80」を指定した場合....、HIGHEST PARENT VALUE(この場合は「1」)をフェッチしてから、すべてを検索する必要があります以下の最高値の親の子。

4

1 に答える 1

3

再帰クエリと擬似列CONNECT_BY_ISLEAFを使用して、ノードの最終的な祖先を見つけることができます。

SELECT parent AS ancestor 
  FROM X 
  WHERE CONNECT_BY_ISLEAF <> 0
  START WITH child=80 
  CONNECT BY PRIOR parent=child
--           ^^^^^^^^^^^^^^^^^^
--             ascendant order

「究極の祖先」を取得したら、2 番目の再帰クエリでそのノードからすべての子孫を取得します。

SELECT child AS descendant, LEVEL
  FROM X
  START WITH parent=1 
  CONNECT BY PRIOR child=parent
--           ^^^^^^^^^^^^^^^^^^
--            descendant order

LEVELノードとその最終的な祖先の間の「距離」を知ることができる疑似列に注意してください。

すべてを一緒に入れて:

SELECT child AS descendant, LEVEL
  FROM X
  START WITH parent IN (

    SELECT parent AS ancestor
      FROM X 
      WHERE CONNECT_BY_ISLEAF <> 0
      START WITH child=80 
      CONNECT BY PRIOR parent=child

  ) 
  CONNECT BY PRIOR child=parent

サンプルデータが与えられた場合の作成:

DESCENDANT  LEVEL
101         1
121         2
80          3
81          3
123         2
102         1
103         1
133         2
于 2014-10-04T13:44:07.767 に答える