2014-01-10 105 views
0

我有一個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

你爲什麼不喜歡這個? – HLGEM

+0

好問題@HLGEM .. OP:你能顯示一些數據還是小提琴? – Kaf

回答

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 
     ) 

注:我添加了WHERE ManagerId IS NOT NULL由於從評論@usr,建議NULL可能是全部欠ManagerId,這將導致NOT IN失敗。不知道模式,這涵蓋了這種情況。

+0

清潔,最小化和快速。 +1。但是:由於NULL值,NOT IN將不起作用。過濾出來。 – usr

+0

@usr - 我沒跟着。難道它不會拉動不在EmployeeManager表中的員工嗎? NULL值來自哪裏? –

+0

也許EmployeeManager.ManagerId可以包含空值。如果只有一個NULL,那麼NOT IN就不會匹配任何東西。 – usr