Извлечение корней с помощью узлов в иерархии с помощью PL / SQL - PullRequest
1 голос
/ 24 августа 2009

У меня есть простое представление типа «родитель / потомок» с двумя столбцами: MYID и MYPARENTID. В 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

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 24 августа 2009

Я еще не использовал его сам, но из моего понимания вашего вопроса я бы подумал, что вы ищете оператор 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 голосов
/ 24 августа 2009

Я не знаю PL / SQL, но вы можете:

  • Вставить список TargetId во временную таблицу
  • Присоединиться к временной таблице с представлением

1009 * Е.Г. *

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
...