TSQL递归查询

TSQL递归查询,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我的工具中有两个我正在使用的表 一个是员工数据库,另一个是包含每个直接下属数量计数的表 以下是我设置的示例表: 下面是我正在处理的一个示例查询。但是,我需要做的是在另一个表中插入一条记录,其中包含每个人拥有的指令数 如果他们没有直接输入,他们就不会被添加到表中 ;WITH employees_CTE (FirstName, LastName, QID, Email, SupQID, Title) AS ( SELECT FirstName,

我的工具中有两个我正在使用的表

一个是员工数据库,另一个是包含每个直接下属数量计数的表

以下是我设置的示例表:

下面是我正在处理的一个示例查询。但是,我需要做的是在另一个表中插入一条记录,其中包含每个人拥有的指令数

如果他们没有直接输入,他们就不会被添加到表中

;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中获取计数,因此我知道是否将其插入表2中

直接下属是指某人的上司是你自己的。该supQID字段是员工的主管(直接)

有什么想法吗

编辑:需要以递归方式而不是通过联接来执行此操作的原因是为了节省空间:并非所有部门都需要这种跟踪,并且能够说“通过X向上报告的任何人”将为将来打开或添加部门(如果需要的话)留下选项。

尝试以下操作:

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 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

在我们的查询之后,您的主要问题是在查询的递归部分没有聚合函数

因此,当您从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
;
请参见上的结果


这提供了一个可以轻松适应您需求的框架。您可以为此包装一个过程声明,并输入要捕获为参数的QID,然后只需将insert语句作为最终select语句的一部分添加即可。SQL FIDLE很不错,但您至少可以将其设置为使字段名与示例查询匹配。抱歉,修正:所以小提琴看起来就像导演的数量一样正确;但我对你的另外两个问题有点困惑。有没有可能在你的小提琴中加入插曲?我已经在那里设置了table2结构。不理解每个人拥有的导演数量。你的意思是
导演数量
?我提供了一个查询,通过
将一条记录插入另一个表中,其中包含每个人拥有的导演数量(根据QID从table2中获取的计数)
对不起,我想你不明白这个问题。假设表2中的数据还不存在。我需要循环查看
employees
表,并计算每个人向他们报告的人数。示例:总裁有一名副总裁向他们汇报工作。它将在表2中插入一个1作为计数。接下来,副总裁有3名经理向他们报告,因此副总裁的“QID”将以3作为计数插入表2中。@SBB已更改您现在可以检查是否有机会包括聊天的链接?开头的评论令人困惑,因为没有人会理解引用。完成。我花了一点时间才找到再次去的地方。