【发布时间】:2021-09-07 12:59:44
【问题描述】:
我有一个包含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 行。
我做错了什么?有没有更好的方法来做这个查询/插入?
【问题讨论】:
-
请展示一些示例数据和预期结果
-
我怀疑在原始查询中,您有多个具有相同管理员的用户。由于您在 ManagerEID 上执行 DISTINCT(),因此您正在删除那些重复项。如果您删除 distinct,您可以看到整个列表……您需要将 where 语句清理为更独特的内容
-
是的,我正在查找特定经理下的所有员工,然后执行不同的操作以获得不同的经理。关于如何实施您的建议的任何想法?
-
DISTINCT不是函数,它基本上意味着GROUP BY每列
标签: sql sql-server sql-server-2008 sql-server-2012