0

基本的に私がやりたいことは、従業員が働いていない店舗のリストを取得することです。問題は、クエリが他の従業員が働いていた店舗のリストを返すことです。たとえば、employee.ID = 1&2 の両方が store.ID = 2 で働いている場合、結果セットには store.ID = 2 が含まれますが、これは Employee.ID = 1 がそこで働いているため、望ましくありません。

SELECT
   stores.name
FROM
   stores
LEFT JOIN
   employeeStoreRelationshipTable
ON
   employeeStoreRelationshipTable.employeeID = employee.id
WHERE
   employeeStoreRelationshipTable.employeeID IS NULL    
OR
   employeeStoreRelationshipTable.employeeID <> [actual Employee ID]

これは、employee.ID = 1 以外の別の従業員がそこで働いているため、store.ID = 2 にフィルターがないため、結合に含まれているためです...

更新:要求に応じて情報を追加しました:

Employee table
id, name
1, Bob
2, John

Store table
ID, name
1, 111 main st.
2, 222 main st.
3, 333 main st.
4, 444 main st.

EmployeeStoreRelationshipTable
employeeID, storeID
1, 1
1, 3
2, 3
3, 4

したがって、この場合、結果は次のようになります。

従業員 1 は店舗 2 と 4 で働いていません。

クエリ結果は 2、3、および 4 です。店舗 3 は、Employee.ID = 2 が店舗 3 で働いているため表示されます。

4

3 に答える 3

2
select *
from stores s
where ID not in (
    select StoreID
    from EmployeeStoreRelationshipTable
    where employeeId=[employeeID])

これは2つのクエリのみを実行します。内側のクエリは彼が使用したIDのリストを生成し、外側のクエリは他のすべてのストアを提供します。

于 2012-05-29T05:10:37.017 に答える
2

このクエリはアンチ結合と呼ばれ、次のようになります (調整が必要な場合があります)。

select name from stores s where 
     not exists (select 1 from employyeRelTable er 
                 where er.employeeId=[employeeID] 
                   and er.storeID=s.storeID)
于 2012-05-29T05:01:17.207 に答える
0

追加してみてください

and employeeStoreRelationshipTable.employeeId = [actual Employee ID] 

結合条件に追加し、where句から削除します

于 2012-05-29T05:01:08.183 に答える