1

次の構造のテーブルがあります。

CHILD_ID | PARENT_ID

両方の列は整数です。

特定の「ノード」のすべての祖先を取得しようとしています。私は最上位のIDを持っており、子のすべてのIDを含むテーブルを選択したいと思います。

CHILD_ID | PARENT_ID
1          2
6          12
2          3
3          4
9          82

の祖先を見つける4

戻る必要があります

ID
3
2
1

これはオラクルでどのように行われますか?

ストアドプロシージャなしで実行できますか?

いつものように、お時間を割いていただきありがとうございます。

4

2 に答える 2

4

出力の期待に応えるために、クエリは次のようになります。

-- sample of data
SQL> with t1(CHILD_ID, PARENT_ID) as(
  2    select 1,  2  from dual union all
  3    select 6,  12 from dual union all
  4    select 2,  3  from dual union all
  5    select 3,  4  from dual union all
  6    select 9,  82 from dual
  7  ) -- actual query
  8  select child_id
  9    from t1
 10  start with parent_id = 4
 11  connect by parent_id = prior child_id
 12  ;

  CHILD_ID
----------
         3
         2
         1
于 2013-01-31T17:12:58.000 に答える
0

最良の解決策は、隣接ツリーまたはネストされたセットツリーのいずれかを実行することです。次に、単一のクエリからサブツリーを返す超高速操作を実行できます。最悪の解決策は、カーソルを取り、レコードをステップスルーし、各レコードの親を繰り返し実行することです。

ネストされたセットツリーは素晴らしいですが、それらの唯一の欠点は、変更されたときに番号を付け直す必要があることです。しかし、たとえば、骨材を計算する必要がある場合、その速度は完全にバナナです。

入れ子集合モデルに関するウィキペディア
ジョー・セルコの説明(優れた)

于 2013-01-31T17:09:45.550 に答える