1

我有一个简单的父/子类型视图,有两列: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 是您正在寻找的。不过需要 Oracle 10g。

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 回答