我有一个简单的父母/子类型观有两个列: 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

我怎么可以这样做?

有帮助吗?

解决方案

我没有用它自己还,但我从你的问题的理解,我认为运营商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

其他提示

我不知道PL/SQL,但你可能能够:

  • 插入TargetId列入一个临时表格
  • 加入临时表的看法

E.g。

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top