SQL Join - 员工未工作的所有商店

时间:2012-05-29 04:50:51

标签: sql join left-join

基本上我想要的是获取员工工作的商店列表。问题是查询返回了其他员工所在的商店列表。因此,例如,如果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中有效。

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子句

中删除