2011-12-12 62 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 = ???