[英]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.