2014-10-05 160 views
1

我在我的工具中使用了2个表。TSQL递归查询

一个是员工数据库,另一个是包含每个直接报告人数的直接报告数的表。

以下是我已经设置了样本表: http://sqlfiddle.com/#!6/0b414/3

下面是一个简单的查询我的工作。但是,我需要做的是将记录插入到另一个表中,并记录每个人的指示数。

如果他们没有直接的,他们不会被添加到表中。

;WITH employees_CTE (FirstName, LastName, QID, Email, SupQID, Title) AS 
    (
     SELECT  FirstName, 
        LastName, 
        QID, 
        Email, 
        SupQID, 
        Title 
     FROM  employees E 
     WHERE  QID = 'Q12345' 

     UNION ALL 

     SELECT  E.FirstName, 
        E.LastName, 
        E.QID, 
        E.Email, 
        E.SupQID, 
        E.Title 
     FROM  employees E 
     INNER JOIN employees_CTE AS E2 ON E.SupQID = E2.QID 
     --Some type of INSERT statement here if the number of people reporting to you are greater than zero. 
    ) 

CTE就我所能得到的。我被困在搞清楚如何从CTE中获得计数,所以我知道是否将它插入到table2中。

直接报告是某人的SupQID是您自己的。 supQID字段是员工的主管(直接)。

任何想法?

编辑:需要递归执行此操作而不是通过连接执行此操作的原因是为了节省空间:并非所有部门都需要此类跟踪,并且能够说“通过X报告的任何人”会留下选项如果有需要的话,可以打开将来打开它,或者增加部门。

+0

SQL小提琴很好,但您至少可以设置它,使字段名称与示例查询匹配。 – 2014-10-05 20:06:23

+0

对不起,修正:http://sqlfiddle.com/#!6/ff315 – SBB 2014-10-05 20:08:18

回答

1

我们chat regarding the reason to want to do this recursively后,必须主要问题是在查询的递归部分没有聚合函数。

因此,你可以在你的结果做一个更加入到当您从CTE选择,就像这样:

;WITH employees_CTE (First, Last, QID, Email, Supervisor, Title) AS 
    (
     SELECT  First, 
        Last, 
        QID, 
        Email, 
        Supervisor, 
        Title 
     FROM  employees E 
     WHERE  QID IN ('Q24285', 'Q07341') 

     UNION ALL 

     SELECT  E.First, 
        E.Last, 
        E.QID, 
        E.Email, 
        E.Supervisor, 
        E.Title 
     FROM  employees E 
     INNER JOIN employees_CTE AS E2 ON E.Supervisor = E2.QID 

     --Some type of INSERT statement here if the number of people reporting to you are greater than zero. 
    ) 
SELECT C.First, C.Last, C.QID, C.EMAIL, C.Supervisor, C.Title, COUNT(DISTINCT E.QID) AS CountOfDirects 
FROM employees_CTE C 
    INNER JOIN Employees E ON E.Supervisor = C.QID 
GROUP BY C.First, C.Last, C.QID, C.EMAIL, C.Supervisor, C.Title 
; 

参见SQLFiddle结果。

这提供了一个框架,可以很容易地适应您的需求。你可以包装一个关于这个的过程声明,并将你想要捕获的QID作为参数提供给feed,然后只需将insert语句添加为最终select语句的一部分,并且你是黄金版。

+0

你想要包含聊天链接的机会吗?开篇评论令人困惑,因为没有人会理解这篇文章。 – Taryn 2014-10-06 16:13:19

+1

完成。花了一点时间找我再次找到它。 – 2014-10-06 16:21:35

1

试试这个:

select E.Title,COUNT(*) CountofDirects,E.First,E.Last from Employees E 
JOIN Employees EE 
ON E.QID=EE.Supervisor 
GROUP BY E.Title,E.First,E.Last 

与INSERT INTO

INSERT INTO TABLE2(Title,CountofDirects,First,Last) 
select E.Title,COUNT(*) CountofDirects,E.First,E.Last from Employees E 
JOIN Employees EE 
ON E.QID=EE.Supervisor 
GROUP BY E.Title,E.First,E.Last 

SQL FIDDLE

+0

所以小提琴看起来就像指挥的人数一样多;但我对你的其他2个查询有点困惑。是否可以将插入添加到你的小提琴?我已经在那里建立了table2结构。 – SBB 2014-10-05 20:11:03

+0

不明白'指示每个人的数量''。你是指'董事数量? – 2014-10-05 20:16:35

+0

我提供了一个查询'插入一个记录到另一个表中,每个人都有指示计数(从基于QID的表2中计数)# – 2014-10-05 20:19:33