【问题标题】:TSQL Recursive QueryTSQL 递归查询
【发布时间】:2014-10-05 19:57:52
【问题描述】:

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

一个是员工数据库,另一个是一个表格,其中包含每个直接下属的人数的计数。

以下是我设置的示例表: 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 报告的任何人”会留下选项打开如果有需要的话,可以在未来开放它,或者增加部门。

【问题讨论】:

  • SQL Fiddle 很好,但您至少可以设置它,使字段名称与您的示例查询匹配。
  • 抱歉,已修复:sqlfiddle.com/#!6/ff315

标签: sql sql-server tsql stored-procedures


【解决方案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 作为参数,然后只需将插入语句添加为最终选择语句的一部分即可。

【讨论】:

  • 您想添加聊天链接吗?开头的评论令人困惑,因为没有人会理解参考。
  • 完成。我花了一点时间才找到再次到达的地方。
【解决方案2】:

试试这个:

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

SQL FIDDLE

【讨论】:

  • 因此,就直接数量而言,小提琴看起来是正确的;但我对你的其他两个查询有点困惑。是否可以将插入添加到您的小提琴中?我已经在那里设置了 table2 结构。
  • 不明白count of directs each person has。你的意思是count of directors ??
  • 我通过Insert a record into another table with the count of directs(count took from table2 based on QID) each person has提供查询
  • 对不起,我认为你不明白这个问题。假装table2中的数据还不存在。我需要遍历employees 表并计算每个人向他们报告的人数。示例:总裁有 1 人向他们汇报,即副总裁。它会将 1 作为计数插入到 table2 中。接下来,VP 有 3 名经理向他们报告,因此 VP 的“QID”将被插入到 table2 中,计数为 3。
  • @SBB 已更改,您现在可以查看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 2011-04-07
  • 2011-03-17
  • 2020-07-01
相关资源
最近更新 更多