基本上我想要的是获取员工不工作的商店列表。问题是查询返回了其他员工所在的商店列表。因此,例如,如果employee.ID = 1&amp; 2都在store.ID = 2下工作,那么结果集将包含store.ID = 2,这是我不想要的,因为Employee.ID = 1在那里工作。< / p>
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,因为除了employee.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.显示存储3是因为Employee.ID = 2在商店3中有效。
答案 0 :(得分:2)
此查询称为anti-join,看起来像这样(可能需要调整它):
select name from stores s where
not exists (select 1 from employyeRelTable er
where er.employeeId=[employeeID]
and er.storeID=s.storeID)
答案 1 :(得分:2)
select *
from stores s
where ID not in (
select StoreID
from EmployeeStoreRelationshipTable
where employeeId=[employeeID])
这只会执行两个查询 - 内部查询生成他使用的ID列表,外部查询会为您提供所有其他商店。
答案 2 :(得分:0)
尝试添加
and employeeStoreRelationshipTable.employeeId = [actual Employee ID]
到连接条件并从where
子句