2011-12-12 64 views
0

我试图在两个字段上写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,); 
+0

你能否为我们提供一个CREATE TABLE脚本和一个数据样本? –

+0

你收到了什么错误信息?或者它如何“不起作用”? – Ollie

+0

CREATE TABLE EMP ( ConnectionPkID NVARCHAR2(16)不为空, 的empType NVARCHAR2(2)不为空, 的EmpID NVARCHAR2(20)不为空, PARENTID NVARCHAR2(20)不为空, ParentType的NVARCHAR2(2)不为空, ); 当我选择LEVEL的所有级别是1. – n3xus

回答

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> 

最重要的一点是要标记CONNECT每个操作数BY与条款PRIOR。

+0

就是这样。我没有放两个PRIOR。我阅读了[link](http://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm)这篇关于Oracle的文档,我认为它们意味着我只能使用一个。 – n3xus

+0

该链接明确指出“您可以拥有多个PRIOR条件”并给出相关示例。 – APC

+0

我知道我可以有多个PRIOR。句子“那么只有一个条件需要PRIOR操作员”使我感到困惑。感谢您的帮助APC – n3xus

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 = ???