在同一个表上使用子查询优化查询

时间:2014-01-10 17:05:33

标签: sql-server

我有一个Employee表和另一个EmployeeManager,我需要进行查询以显示所有非经理的员工和另一个显示所有员工的经理。

这是第一个查询:

SELECT E.EmployeeId, E.FirstName, E.LastName
  FROM Employee E
 INNER JOIN (SELECT a.EmployeeId,
                (SELECT COUNT(*) FROM EmployeeManager b 
                      WHERE a.EmployeeId = b.Managerid) IsManager
               FROM EmployeeManager a) ER
    ON E.EmployeeId = ER.EmployeeId
   AND ER.IsManager = 0

还有更好的选择吗?因为我根本不喜欢。

1 个答案:

答案 0 :(得分:1)

作为经理的所有员工:

SELECT   E.EmployeeId, E.FirstName, E.LastName
FROM     Employee E
JOIN     EmployeeManager M ON E.EmployeeId = M.ManagerId

所有经理的员工

SELECT   EmployeeId, FirstName, LastName
FROM     Employee
WHERE    EmployeeId NOT IN 
         (
             SELECT   ManagerId 
             FROM     EmployeeManager 
             WHERE    ManagerId IS NOT NULL
         )

注意:由于来自 @usr 的评论,我添加了WHERE ManagerId IS NOT NULL,表明ManagerId可能允许使用NULL,这会导致{{1} }} 失败。在不知道架构的情况下,这涵盖了该场景。