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]

这是因为加入包含它,因为没有过滤器来存储。ID = 2 因为员工以外的另一名员工。ID = 1 在那里工作......

更新:按要求添加信息:

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。出现 Store 3 是因为 Employee.ID = 2 已经在 store 3 工作。

4

3 回答 3

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 回答
2
select *
from stores s
where ID not in (
    select StoreID
    from EmployeeStoreRelationshipTable
    where employeeId=[employeeID])

这仅执行两个查询 - 内部一个生成他使用的 ID 列表,外部一个为您提供所有其他商店。

于 2012-05-29T05:10:37.017 回答
0

尝试添加

and employeeStoreRelationshipTable.employeeId = [actual Employee ID] 

加入条件并从where子句中删除

于 2012-05-29T05:01:08.183 回答