0

我有一個組織表看起來像這樣:反向開始有了

USER_ID | USER_NAME | RPT_TO_USR 
1   Bob   2 
2   John  3 
3   Wendy  {null} 

我試圖建立一個查詢,將建立自己的組織,並確定不同的等級。我能做到這一點,如果我有我想開始通過CONNECT BY

SELECT USER_ID, USER_NAME, RPT_TO_USR, LEVEL 
FROM USERTABLE 
START WITH USER_ID = 1 
CONNECT BY USER_ID = PRIOR RPT_TO_USR 

不過,我要開始與用戶3,構建關閉特定的用戶。我一直在評論Oracle文檔和一些關於堆棧溢出的CTE文章,試圖看看這是否是一種解決方案,或者是否有方法來逆轉START WITHCONNECT BY的流程,但到目前爲止我還沒有取得任何成功。

基本上,而不是開始與鮑勃,並知道他向約翰報告溫蒂報告,我想從溫迪開始,並知道約翰報告給她,鮑勃報告約翰。

回答

1

遞歸查詢與CTE:

WITH CTE (USER_ID,USER_NAME,RPT_TO_USR,LV) AS 
(
    SELECT USER_ID,USER_NAME,RPT_TO_USR,1 
     FROM USERTABLE 
    WHERE RPT_TO_USR IS NULL 
    UNION ALL 
    SELECT A.USER_ID,A.USER_NAME,A.RPT_TO_USR,B.LV + 1 
     FROM USERTABLE A, CTE B 
    WHERE A.RPT_TO_USR = B.USER_ID 
) 
SELECT * FROM CTE; 
+0

謝謝。這是一個很好的例子,而且我最終的結果不僅僅是您使用RPT_TO_USR的方式。 – Alexander

1

應該只是改變你使用的列...由XXX =事先在連接到開始和秩序兩列的問題...

SELECT USER_ID, USER_NAME, RPT_TO_USR, LEVEL 
from org 
start with rpt_to_usr is null 
CONNECT BY RPT_TO_USR = PRIOR USER_ID 

enter image description here

+0

我已經不正當地認爲我會因爲某種原因而無法在這個實例中使用空值。感謝您指出我思想中的錯誤。 – Alexander

+0

這實際上是從樹的根開始並遍歷到葉節點的分層查詢的更常見用法之一。切換它,從Bob開始,簡單地產生從Bob回到他最高級別經理的路徑。這是有用的信息,但幾乎沒有趣味。 – Sentinel