2

私は2つのテーブルEmployeeとsalary Employee => ID、Name Fieldsを持っています

給与 => Sid, EId(Foriegn key) , Month, Salary

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

最適化が必要なため、3月に給与を受け取っていない従業員を検索し、結合のみを使用する必要があります

サブクエリを次のように使用して検索ステートメントを持っています

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;

しかし、これは私が望んでいたことではありません。3 月に給与が支払われなかった従業員のみが必要です

4

2 に答える 2

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 フィドルのデモ

于 2013-02-27T10:45:52.250 に答える
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)

これを試して。

于 2013-02-27T10:58:46.560 に答える