我试图通过使用外连接来寻找NOT IN查询的替代方法。我试图找到没有做过任何汽车服务的员工的详细信息。
我的NOT IN示例看起来像这样
SELECT Employee.EmployeeID, Employee.FirstName, Employee.LastName, Employee.Salary, Employee.[EmployeeID]
FROM Employee
WHERE (((Employee.[EmployeeID]) Not In (SELECT EmployeeID from Service)));
我的外部加入草案有效,但它显示了我想要的完全相反(即它显示了已完成服务的员工的详细信息)
SELECT E.EmployeeId, E.FirstName, E.LastName, E.Salary
FROM Employee AS E
RIGHT OUTER JOIN Service AS S
ON E.EmployeeId = S.EmployeeId
GROUP BY E.EmployeeId, E.FirstName, E.LastName, E.Salary;
非常感谢任何帮助 感谢
答案 0 :(得分:0)
添加以下内容应该有效:
WHERE S.EmployeeID is null
使用left join
代替right
。
答案 1 :(得分:0)
试试这个:
SELECT E.EmployeeId, E.FirstName, E.LastName, E.Salary
FROM Employee AS E
LEFT JOIN Service AS S ON E.EmployeeId = S.EmployeeId
WHERE S.EmployeeID is NULL
GROUP BY E.EmployeeId, E.FirstName, E.LastName, E.Salary;
SELECT <fields> FROM Employee
- 选择所有员工LEFT JOIN Service
- 同样,找到每位员工的所有服务记录但是,LEFT JOIN表示如果员工没有匹配的服务记录,则无论如何都要返回服务行,但是填写所有字段为NULL。如果将S.EmployeeID添加到字段列表并删除WHERE,您将看到这一点。某些行将具有NULL S.EmployeeID,而其他行将具有带有值的S.EmployeeID。 NULLS是没有找到记录的行,但LEFT JOIN将列添加为NULL。
WHERE子句告诉我们只返回S.EmployeeId为NULL的记录,这在没有找到匹配的服务记录时发生