2009-08-24 15 views
1

2つの列、つまりMYIDMYPARENTIDを持つ単純な親子タイプのビューがあります。PL/SQLで階層内のノードを持つルーツを取得

SELECT MYID 
FROM MYVIEW 
START WITH MYID = 'TargetId1' 
CONNECT BY PRIOR MYID = MYPARENTID 

そして、私は戻って、このようなものになるだろう:PL/SQLでは、親の子のすべてのリストを取得することは十分に簡単です

MYID 
----------- 
TargetId1 
TargetId1Child1 
TargetId1Grandchild1 

をしかし、今の私がしたいことを言わせて両親のセットのためにこれを行うには、すべてを一度に:

MYID 
--------- 
TargetId1 
TargetId1Child1 
TargetId1Grandchild1 
TargetId2 
TargetId2Child2 
TargetId2Grandchild1 
TargetId3 
TargetId3Child3 
TargetId3Grandchild1 

SELECT MYID 
FROM MYVIEW 
START WITH MYID IN ('TargetId1', 'TargetId2', 'TargetId3') 
CONNECT BY PRIOR MYID = MYPARENTID 

私の結果はこのようになります

このようにすると、特定の子ノードがどこから来たのかを知ることができなくなります。私は子供のリストを返すが、私は各子供が由来する根(本質的にはSTART WITHの値)を知りたい。

私はこのようになり、結果セットをしたい:

MYID     ROOT 
---------------------------------- 
TargetId1    TargetId1 
TargetId1Child1   TargetId1 
TargetId1Grandchild1 TargetId1 
TargetId2    TargetId2 
TargetId2Child2   TargetId2 
TargetId2Grandchild2 TargetId2 
TargetId3    TargetId3 
TargetId3Child3   TargetId3 
TargetId3Grandchild3 TargetId3 

私はこれをどのように行うことができますか?

答えて

1

私はまだそれを自分自身を使用していないが、あなたの質問の私の理解から、私は、オペレータCONNECT_BY_ROOTは、あなたが探しているものだと思います。ただし、Oracle 10gが必要です。

SELECT MYID 
     ,CONNECT_BY_ROOT MYID ROOT 
FROM MYVIEW 
START WITH MYID IN ('TargetId1', 'TargetId2', 'TargetId3') 
CONNECT BY PRIOR MYID = MYPARENTID 
+0

優秀!どうもありがとう。 – DivisionByZorro

0

私は、PL/SQLを知らないが、あなたはすることができるかもしれません:

  • は一時テーブル
  • にtargetIDのリストを挿入ビュー

で一時テーブルに参加例えば

CREATE TABLE #Parents (TargetId) 

INSERT INTO #Parents TargetId1 
INSERT INTO #Parents TargetId2 
... 
INSERT INTO #Parents TargetId10 

SELECT MYID, #Parents.TargetID 
FROM MYVIEW, #Parents 
CONNECT BY MYID = #Parents.TargetID 
CONNECT BY PRIOR MYID = MYPARENTID 
+0

問題のSQLコードは、Webサービスによって生成されて実行されます。 DBを持つSLAが、一時テーブルを使用して操作を完了できるようになるとは思わない。 – DivisionByZorro

関連する問題