两个字段的递归查询

时间:2011-12-12 09:35:49

标签: sql oracle recursive-query

我正在尝试在两个字段上写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 个答案:

答案 0 :(得分:2)

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 :(得分:1)

鉴于此测试数据:

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>

重要的一点是使用PRIOR标记CONNECT BY子句中的每个操作数。