我有一个用户表与下面的架构,我如何获得ID为管理人员名单?
UserId, Name, ManagerId
该经理ID,不过是一个用户ID作为管理者也是一个用户。
我可以得到经理使用下面的查询列表,但我如何得到managerId与名称?
Select DISTINCT(ManagerId) from Users
group by ManagerId
我想下面的输出
ManagerId, Name
我有一个用户表与下面的架构,我如何获得ID为管理人员名单?
UserId, Name, ManagerId
该经理ID,不过是一个用户ID作为管理者也是一个用户。
我可以得到经理使用下面的查询列表,但我如何得到managerId与名称?
Select DISTINCT(ManagerId) from Users
group by ManagerId
我想下面的输出
ManagerId, Name
试试这个:
SELECT UserId, Name
FROM Permission
WHERE UserId IN (Select DISTINCT ManagerId FROM Permission)
还可能有JOIN
:
SELECT UserId, Name
FROM Permission AS p1
JOIN (Select DISTINCT ManagerId FROM Permission) AS p2
ON p1.UserId = p2.MAnagerId
我相信你想找回谁是用户经理。
SELECT DISTINCT UserId, Name
FROM Permission p1
WHERE EXISTS (
SELECT 1
FROM Permission p2
WHERE p1.UserId = p2.ManagerId
)
DISTINCT
子句是可选的,并且可以根据您的数据是多余的:这可以通过使用EXISTS
子句来完成。如果是这种情况,请移除它以提升性能(不同的是需要对输入进行排序,然后删除重复项)。
我不确定是否将IN
与DISTINCT
一起使用是个好主意,例如Giorgos建议的。 SQL Server有一个很好的优化引擎,但是我对这样的语句有不好的经验。
更好地利用EXISTS
SELECT P1.UserId, P1.Name
FROM Permission AS P1
WHERE EXISTS (
SELECT *
FROM Permission AS P2
WHERE P2.ManagerId = P1.UserId
);
请记住,这将是对Permission
表的索引,其中第一个索引列将UserId
,而在另一个指标ManagerId
一个好主意。这种方式EXISTS
将非常有效地执行。
这应该是最有效的方法? – NoobDeveloper
我认为第二个查询比第一个查询更高效。 –