рекурсивный запрос по двум полям - PullRequest
0 голосов
/ 12 декабря 2011

Я пытаюсь написать CONNECT BY PRIOR в двух полях. У кого-нибудь есть идеи?

В конце концов я хочу что-то вроде следующего. К сожалению, это не работает

SELECT *
FROM emp
CONNECT BY PRIOR emp.type = emp.parenttype AND emp.ID = emp.ParentID

Сценарий создания таблицы:

CREATE TABLE emp ( 
    ConnectionPkID NVARCHAR2(16) Not Null, 
    EmpType NVARCHAR2(2) Not Null, 
    EmpID NVARCHAR2(20) Not Null, 
    ParentID NVARCHAR2(20) Not Null, 
    ParentType NVARCHAR2(2) Not Null, );

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

PRIOR является частью условия, а не условия CONNECT BY. Вы должны квалифицировать каждое родительское поле с ним. Попробуйте это:

SELECT *
FROM emp
CONNECT BY PRIOR emp.type = emp.parenttype AND PRIOR emp.ID = emp.ParentID
START WITH emp.ID = ??? AND emp.type = ???
1 голос
/ 12 декабря 2011

Учитывая данные этого теста:

SQL> select * from t23
  2  /

        ID TYP  PARENT_ID PAR NAME
---------- --- ---------- --- --------------------
         1 P                  Fox in Socks
         2 P                  The Lorax
         1 C            1 P   Mr Knox
         2 C            1 P   Daisy-Headed Maisie
         3 C            2 P   Mr KnoHortonx

SQL> 

работает эта версия вашего запроса:

 SQL> select level, t23.*
from t23
connect by prior t23.id = t23.parent_id
and prior t23.type = t23.parent_type 
start with t23.parent_id is null and t23.parent_type is null
/
  2    3    4    5    6  
     LEVEL         ID TYP  PARENT_ID PAR NAME
---------- ---------- --- ---------- --- --------------------
         1          1 P                  Fox in Socks
         2          1 C            1 P   Mr Knox
         2          2 C            1 P   Daisy-Headed Maisie
         1          2 P                  The Lorax
         2          3 C            2 P   Mr KnoHortonx

SQL>

Важным битом является пометка каждого операнда в предложении CONNECT BY с помощью PRIOR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...