这是我用来创建答案的一些测试数据(为了便于阅读,我稍微重命名了几列,添加了另一条记录来演示功能):
CREATE TABLE #test (EmployeeID INT, SiteID INT, LineManagerID INT, OwnerID INT)
INSERT INTO #test
(
EmployeeID
,SiteID
,LineManagerID
,OwnerID
)
VALUES
(
1234 -- EmployeeID
,123 -- SiteID
,2345 -- LineManagerID
,NULL -- OwnerID
),
(
2345 -- EmployeeID
,123 -- SiteID
,3456 -- LineManagerID
,NULL -- OwnerID
),
(
3456 -- EmployeeID
,123 -- SiteID
,5678 -- LineManagerID
,NULL -- OwnerID
),
(
5678 -- EmployeeID
,123 -- SiteID
,1002 -- LineManagerID
,NULL -- OwnerID
),
(
1002 -- EmployeeID
,567 -- SiteID
,1103 -- LineManagerID
,NULL -- OwnerID
),
(
1103 -- EmployeeID
,568 -- SiteID
,6669 -- LineManagerID
,NULL -- OwnerID
)
然后您的UPDATE 将使用递归 CTE 来计算每个 SiteID 的顶部 LineManagerID。
;WITH UserCTE
AS (SELECT EmployeeID,
SiteID,
LineManagerID,
0 AS [Level],
NULL AS mgrEmpID
FROM #test
UNION ALL
SELECT usr.EmployeeID,
usr.SiteID,
usr.LineManagerID,
mgr.[Level] + 1,
mgr.EmployeeID AS mgrEmpID
FROM #test AS usr
INNER JOIN UserCTE AS mgr ON usr.LineManagerID = mgr.EmployeeID AND usr.SiteID <> mgr.SiteID
WHERE usr.LineManagerID IS NOT NULL
)
UPDATE t
SET t.OwnerID = u.mgrEmpID
FROM #test t
LEFT JOIN UserCTE u ON t.SiteID = u.SiteID AND u.[Level] = 1
这是UPDATE之后的表格:
EmployeeID SiteID LineManagerID OwnerID
1234 123 2345 1002
2345 123 3456 1002
3456 123 5678 1002
5678 123 1002 1002
1002 567 1103 1103
1103 568 6669 NULL