SQL 服务器分层查找所有管理器并插入管理器
SQL Server hierarchical find all managers for manager and insert
我有一名员工 table,其中包括 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 行。
问题是我想将这些行插入到一个新的 table 中,该新 table 有一些我需要填充的其他列。所以我尝试这样做:
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 行。
我做错了什么?有更好的方法吗query/insert?
您可以再添加一个新的 CTE table,然后使用新的 CTE table 来处理插入。
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
在您的原始查询中,您只有 managerId 和您已删除的重复项。
在您后续的插入查询中,因为您使用的是 NEWID(),所以每一行都是唯一的。所以,您的 DISTINCT 没有过滤重复的 ManagerId。
我在下面使用简单的代码来解释您的情况。
declare @TABLE Table(ManagerId int)
insert into @Table
values (1),(1),(1)
SELECT DISTINCT(managerid), newid() as id from @table
managerid
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
我有一名员工 table,其中包括 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 行。
问题是我想将这些行插入到一个新的 table 中,该新 table 有一些我需要填充的其他列。所以我尝试这样做:
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 行。
我做错了什么?有更好的方法吗query/insert?
您可以再添加一个新的 CTE table,然后使用新的 CTE table 来处理插入。
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
在您的原始查询中,您只有 managerId 和您已删除的重复项。
在您后续的插入查询中,因为您使用的是 NEWID(),所以每一行都是唯一的。所以,您的 DISTINCT 没有过滤重复的 ManagerId。
我在下面使用简单的代码来解释您的情况。
declare @TABLE Table(ManagerId int)
insert into @Table
values (1),(1),(1)
SELECT DISTINCT(managerid), newid() as id from @table
managerid | 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