2013-02-27 48 views
2

我有2代表僱員和工資 僱工=> ID,名稱字段轉換子查詢中加入

工資=>希德,EID(Foriegn鍵),月工資

Employee 
ID Name 
1 a 
2 b 
3 c 

Salary 
Sid Eid Month Salary 
1 1 Jan 10 
2 2 Jan 10 
3 3 Jan 10 
4 1 Feb 10 
5 3 Feb 10 
6 1 Mar 10 
7 2 Mar 10 

需要找到誰沒有拿到工資在三月份的一個月,因爲我需要優化使用連接只有員工

使用子查詢作爲

select E.Name from Employee where E.ID not in (Select EID from salary where month ='mar'); 
我有搜索語句

優化旨意,我被要求將其轉換爲加盟

我嘗試使用

Select E.Name from Employee E left join Salary S on E.ID = S.EID where S.EID = null; 

但是,這不是我想要的我只需要誰不給工資在每月員工只要。

+0

我的子查詢工作正常 – 2013-02-27 10:35:34

+0

這個解決方案很好,你爲什麼需要連接查詢? – 2013-02-27 10:45:00

+0

這種情況下需要優化。性能和其他因素驅動當前Web和數據庫世界 – 2013-03-01 08:48:51

回答

4

試試這個:

SELECT E.Name 
FROM Employee E 
    LEFT JOIN salary S 
     ON E.Id = S.EID 
      AND S.month ='mar' 
GROUP BY E.Name 
HAVING COUNT(E.Id) != COUNT(S.EID) 

SQL FIDDLE DEMO

+2

組通過e.name可能是錯誤的,因爲可能有類似名稱的員工。 – 2013-02-27 10:57:30

+0

@MaulikVora可能是,可能是... – 2013-02-27 10:59:18

+0

感謝它運行 – 2013-02-27 11:46:30

1
SELECT E.Name 
FROM Employee E 
    LEFT JOIN salary S 
     ON E.Id = S.EID 
      AND S.month ='mar' 
GROUP BY E.Id 
HAVING COUNT(E.Id) != COUNT(S.EID) 

嘗試。