2016-03-15 84 views
-4

我有一个用户表与下面的架构,我如何获得ID为管理人员名单?

UserId, Name, ManagerId 

该经理ID,不过是一个用户ID作为管理者也是一个用户。

我可以得到经理使用下面的查询列表,但我如何得到managerId与名称?

Select DISTINCT(ManagerId) from Users 
group by ManagerId 

我想下面的输出

ManagerId, Name 

回答

3

试试这个:

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 
+0

这应该是最有效的方法? – NoobDeveloper

+0

我认为第二个查询比第一个查询更高效。 –

0

我相信你想找回谁是用户经理。

SELECT DISTINCT UserId, Name 
FROM Permission p1 
WHERE EXISTS (
    SELECT 1 
    FROM Permission p2 
    WHERE p1.UserId = p2.ManagerId 
) 

DISTINCT子句是可选的,并且可以根据您的数据是多余的:这可以通过使用EXISTS子句来完成。如果是这种情况,请移除它以提升性能(不同的是需要对输入进行排序,然后删除重复项)。

0

我不确定是否将INDISTINCT一起使用是个好主意,例如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将非常有效地执行。

相关问题