Plsql 使用PL/SQL检索层次结构中具有节点的根

Plsql 使用PL/SQL检索层次结构中具有节点的根,plsql,hierarchy,Plsql,Hierarchy,我有一个简单的父/子类型视图,有两列:MYID和MYPARENTID。在PL/SQL中,获取父级的所有子级的列表非常简单: SELECT MYID FROM MYVIEW START WITH MYID = 'TargetId1' CONNECT BY PRIOR MYID = MYPARENTID 我会得到这样的回报: MYID ----------- TargetId1 TargetId1Child1 TargetId1Grandchild1 MYID --------- Targ

我有一个简单的父/子类型视图,有两列:
MYID
MYPARENTID
。在PL/SQL中,获取父级的所有子级的列表非常简单:

SELECT MYID 
FROM MYVIEW 
START WITH MYID = 'TargetId1' 
CONNECT BY PRIOR MYID = MYPARENTID
我会得到这样的回报:

MYID
-----------
TargetId1
TargetId1Child1
TargetId1Grandchild1
MYID
---------
TargetId1
TargetId1Child1
TargetId1Grandchild1
TargetId2
TargetId2Child2
TargetId2Grandchild1
TargetId3
TargetId3Child3
TargetId3Grandchild1
MYID                    ROOT
----------------------------------
TargetId1               TargetId1
TargetId1Child1         TargetId1
TargetId1Grandchild1    TargetId1
TargetId2               TargetId2
TargetId2Child2         TargetId2
TargetId2Grandchild2    TargetId2
TargetId3               TargetId3
TargetId3Child3         TargetId3
TargetId3Grandchild3    TargetId3
但现在让我们说,我想同时为一组父母做这件事:

SELECT MYID 
FROM MYVIEW 
START WITH MYID IN ('TargetId1', 'TargetId2', 'TargetId3') 
CONNECT BY PRIOR MYID = MYPARENTID
我的结果如下所示:

MYID
-----------
TargetId1
TargetId1Child1
TargetId1Grandchild1
MYID
---------
TargetId1
TargetId1Child1
TargetId1Grandchild1
TargetId2
TargetId2Child2
TargetId2Grandchild1
TargetId3
TargetId3Child3
TargetId3Grandchild1
MYID                    ROOT
----------------------------------
TargetId1               TargetId1
TargetId1Child1         TargetId1
TargetId1Grandchild1    TargetId1
TargetId2               TargetId2
TargetId2Child2         TargetId2
TargetId2Grandchild2    TargetId2
TargetId3               TargetId3
TargetId3Child3         TargetId3
TargetId3Grandchild3    TargetId3
当我这样做时,我就失去了知道特定子节点来自何处的能力。我得到一个孩子列表,但我想知道每个孩子来自哪个根(本质上是
值开头)

我想要一个如下所示的结果集:

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

我怎样才能做到这一点?

我不知道PL/SQL,但您可以:

  • 将TargetId列表插入临时表
  • 将临时表与视图连接起来
例如


我不知道PL/SQL,但您可以:

  • 将TargetId列表插入临时表
  • 将临时表与视图连接起来
例如


我自己还没有用过,但根据我对您问题的理解,我认为您正在寻找的是通过根连接的操作符。但需要Oracle 10g

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

我自己还没有用过,但根据我对您问题的理解,我认为您正在寻找的是通过根连接的操作符。但需要Oracle 10g

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

所讨论的sql代码将由web服务生成和执行;我认为带有DB的SLA不允许我们使用临时表来完成操作;我认为带有DB的SLA不允许我们使用临时表来完成操作。