1

2つの列を持つ単純な親/子タイプのビューがあります:MYIDMYPARENTID。PL / SQLでは、親のすべての子のリストを取得するのは非常に簡単です。

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

そして、私はこのようなものを取り戻すでしょう:

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

しかし、今度は、これを一連の親に対して一度に実行したいとします。

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

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

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

このようにすると、特定の子ノードがどこから来たのかを知ることができなくなります。START WITH子のリストを取得しますが、各子がどのルート(基本的には値)から発生したのかを知りたいです。

次のような結果セットが必要です。

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

これどうやってするの?

4

2 に答える 2

1

私自身はまだ使っていませんが、あなたの質問を理解していると、演算子CONNECT_BY_ROOTがあなたが探しているものだと思います。ただし、Oracle10gが必要です。

SELECT MYID
      ,CONNECT_BY_ROOT MYID ROOT
FROM MYVIEW 
START WITH MYID IN ('TargetId1', 'TargetId2', 'TargetId3') 
CONNECT BY PRIOR MYID = MYPARENTID
于 2009-08-24T17:15:26.820 に答える
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
于 2009-08-24T14:59:07.583 に答える