2014-05-20 68 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;