2014-05-20 108 views
0

我需要創建一個CTE腳本,以便能夠選擇一名特定員工下的員工,並且能夠將父級包括在列表中。使用CTE的父子關係Sql Server

例如我有僱員123有三名僱員在他下面,111,222和333,我有一個已經創建了三個層次的視圖,用戶點擊123,應該能夠看到111,222和333,我也想包括123的信息。

我應該能夠從任何節點開始獲取此信息,我的問題是也包括起始節點。

下面是代碼:

declare @Personnel AS TABLE 
(
    child_id INT NOT NULL PRIMARY KEY, 
    parent_id INT 
); 

INSERT INTO @Personnel(child_id, parent_id) 
    SELECT 111, 123 UNION ALL 
    SELECT 222, 123 UNION ALL 
    SELECT 333, 123 

;WITH ChildsCTE(child_id, parent_id) AS 
    (
     SELECT child_id, parent_id 
     FROM @Personnel 
     WHERE parent_id = 123 

     UNION ALL 

     SELECT Curr.child_id, Curr.parent_id 
     FROM ChildsCTE AS Prev 
      INNER JOIN 
      @Personnel AS Curr 
      ON Curr.parent_id = Prev.child_id 
    ) 
    SELECT C.child_id, C.parent_id 
    FROM ChildsCTE AS C 

我希望能夠檢索:

child_id parent_id 
111   123 
222   123 
333   123 

加上這樣以某種方式父:

child_id parent_id 
111   123 
222   123 
333   123 
123    123 (or NULL) 

父是不是頂級員工,可以是任何人,當然也可以是頂級員工。

+0

該查詢似乎工作正常。你能否包括表格數據和預期的輸出? –

+0

它工作正常,但我需要能夠包括在孩子的名單,父母以及,例如,如果我點擊父母我想去,並帶來與他下的人包括他的所有電子郵件。這就是目標 – rgx71

+0

您可以發佈數據嗎? –

回答

0

您只需要以child_id = 123作爲起始節點。請參閱SQL Fiddle here

;WITH ChildsCTE(child_id, parent_id) AS 
    (
     SELECT child_id, parent_id 
     FROM @Personnel 
     WHERE child_id = 123 

     UNION ALL 

     SELECT Curr.child_id, Curr.parent_id 
     FROM ChildsCTE AS Prev 
      INNER JOIN 
      @Personnel AS Curr 
      ON Curr.parent_id = Prev.child_id 
    ) 
    SELECT C.child_id, C.parent_id 
    FROM ChildsCTE AS C; 

如果parent_id(123)的parent_id也是相同的,那麼請使用下面的查詢。在連接中使用child_id和parent_id(SQL Fiddle)。

;WITH ChildsCTE(child_id, parent_id) AS 
    (
     SELECT child_id, parent_id 
     FROM @Personnel 
     WHERE child_id = 123 and parent_id = 123 

     UNION ALL 

     SELECT Curr.child_id, Curr.parent_id 
     FROM ChildsCTE AS Prev 
      INNER JOIN 
      @Personnel AS Curr 
      ON Curr.parent_id = Prev.child_id AND Curr.child_id <> Prev.parent_id 
    ) 
    SELECT C.child_id, C.parent_id 
    FROM ChildsCTE AS C;