繁体   English   中英

TSQL递归查询更新临时表

[英]TSQL Recursive Query Update Temp Table

我有一个查询,该查询以递归方式遍历我的员工ORG,并获取向VP报告的所有人员的列表。 该查询按预期工作:

DECLARE @pit AS DATETIME = GETDATE();

DECLARE @table TABLE (
    mgrQID     VARCHAR (64) ,
    QID        VARCHAR (64) ,
    NTID       VARCHAR (64) ,
    FullName   VARCHAR (256),
    lvl        INT          ,
    metadate   DATETIME     ,
    totalCount INT          );

WITH   empList (mgrQID, QID, NTID, FullName, lvl, metadate)
AS     (SELECT   TOP 1 mgrQID,
                       QID,
                       NTID,
                       FirstName + ' ' + LastName,
                       0,
                       Meta_LogDate
        FROM     dbo.EmployeeTable_Historical
        WHERE    QID IN (SELECT director
                         FROM   dbo.attritionDirectors)
                 AND Meta_LogDate <= @pit
        ORDER BY Meta_LogDate DESC
        UNION ALL
        SELECT   b.mgrQID,
                 b.QID,
                 b.NTID,
                 b.FirstName + ' ' + b.LastName,
                 lvl + 1,
                 b.Meta_LogDate
        FROM     empList AS a CROSS APPLY dbo.Fetch_DirectsHistorical_by_qid (a.QID, @pit) AS b)
-- Insert into the counts table
INSERT INTO @table (mgrQID, QID, NTID, FullName, lvl, metadate, totalCount)
SELECT   empList.mgrQID,
         empList.QID,
         empList.NTID,
         empList.FullName,
         empList.lvl,
         empList.metadate,
         '0'
FROM     empList
ORDER BY lvl
OPTION (MAXRECURSION 10);

如您所见,我有一个名为totalCount的表列,在第一个递归查询中将其设置为0

现在,我有了第二个查询,该查询遍历了该临时表中的所有人员,并找到了针对他们的直接报告总数。

例如,如果一个董事有3位经理,而每位经理有3名员工,则要向该董事报告12个人; 9名员工和3名经理。

这来自以下查询:

;WITH     a
AS       (SELECT mgrQID AS direct,
                 QID
          FROM   @table AS t
          WHERE  QID IN (SELECT QID
                         FROM   @table)
          UNION ALL
          SELECT a.direct,
                 t.QID
          FROM   @table AS t
                 INNER JOIN
                 a
                 ON t.mgrQID = a.QID)
--subtracting 1 because it is also counting the manager
SELECT   direct,
         count(*) - 1 AS totalCount
FROM     a
GROUP BY direct
OPTION (MAXRECURSION 10);

我的问题是

如何使用第二个查询获得的计数更新@temp totalCount QID和Direct是两者之间的两个共同字段。

尝试这个:

update t
set t.totalCount = a.count(*) - 1
from a
join @temp t
    on a.Direct = t.QID
group by a.direct, t.QID
option (maxrecursion 10)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM