我有一個包含EmployeeId和的員工表ManagerId。我正在嘗試進行分層查詢并查找特定經理下的所有經理,即使他們不是直接報告。
到目前為止,我創建了這個查詢
WITH cte_org AS
(
SELECT
EmployeeId,
FirstName,
LastName,
ManagerEID
FROM
Users
WHERE
ManagerEID = @ManagerEID
UNION ALL
SELECT
u.EmployeeId,
u.FirstName,
u.LastName,
u.ManagerEID
FROM
Users u
INNER JOIN
cte_org o ON o.EmployeeId = u.ManagerEID
)
SELECT DISTINCT(ManagerEID)
FROM cte_org
WHERE ManagerEID != @ManagerEID;
這個查詢作業正常,在這個特定的場景中,我選擇了 13 行。
問題是我想將這些行插入到一個新表中,該表有一些我需要填充的其他列。所以我試圖這樣做:
WITH cte_org AS
(
SELECT
EmployeeId,
FirstName,
LastName,
ManagerEID
FROM
Users
WHERE
ManagerEID = @ManagerEID
UNION ALL
SELECT
u.EmployeeId,
u.FirstName,
u.LastName,
u.ManagerEID
FROM
Users u
INNER JOIN
cte_org o ON o.EmployeeId = u.ManagerEID
)
INSERT INTO TeamRoles (ManagerEID, Id, TeamName, IsTopLevel, IsRecursive, TopLevelManagerEID, RoleId)
SELECT DISTINCT(ManagerEID), NEWID(), 'Static VALUE', 0, 1, @ManagerEID, 4
FROM cte_org
WHERE ManagerEID != @MangerEID;
現在這個查詢插入了 33 行。
我究竟做錯了什么?有沒有更好的方法來做這個查詢/插入?
uj5u.com熱心網友回復:
您可以再添加一張新的 CTE 表,然后使用新的 CTE 表來處理插入。
WITH cte_org AS (
SELECT
EmployeeId,
FirstName,
LastName,
ManagerEID
FROM
Users
WHERE ManagerEID = @ManagerEID
UNION ALL
SELECT
u.EmployeeId,
u.FirstName,
u.LastName,
u.ManagerEID
FROM
Users u
INNER JOIN cte_org o
ON o.EmployeeId = u.ManagerEID
),
cte_org_new
AS
(
SELECT distinct(ManagerEID)
from cte_org
where ManagerEID != @ManagerEID;
)
INSERT Into TeamRoles(ManagerEID, Id, TeamName, IsTopLevel, IsRecursive, TopLevelManagerEID, RoleId)
SELECT ManagerEID, NEWID(), 'Static VALUE', 0, 1, @ManagerEID, 4
FROM cte_org_new
uj5u.com熱心網友回復:
在您的原始查詢中,您只有 managerId 和您不同的已洗掉重復項。
在您隨后的插入查詢中,由于您擁有 NEWID(),因此每一行都是唯一的。因此,您的 DISTINCT 沒有過濾重復的 ManagerId。
我在下面有簡單的代碼來解釋您的情況。
declare @TABLE Table(ManagerId int)
insert into @Table
values (1),(1),(1)
SELECT DISTINCT(managerid), newid() as id from @table
| 經理ID | ID |
|---|---|
| 1 | 401845D6-BA6F-4BE2-9200-171A24BDCFB8 |
| 1 | 8A54A569-DC87-4FD9-A05A-55AAF40E4F35 |
| 1 | 46C789BD-E5F3-458A-9EFA-B5B63621F189 |
你要做的是,
INSERT Into TeamRoles(ManagerEID, Id, TeamName, IsTopLevel, IsRecursive, TopLevelManagerEID, RoleId)
SELECT ManagerEID , NEWID(), 'Static VALUE', 0, 1, @ManagerEID, 4
FROM
(SELECT distinct(ManagerEID)
FROM cte_org
WHERE ManagerEID != @MangerEID) as t
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/422591.html
標籤:
