【问题标题】:Issue with an Outer JOIN外部 JOIN 问题
【发布时间】:2014-07-31 02:02:47
【问题描述】:

我正在尝试通过使用外连接来找到 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)));

我的 Outer Join 草案有效,但它显示的结果与我想要的完全相反(即它显示了已完成服务的员工的详细信息)

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;

任何帮助将不胜感激 谢谢

【问题讨论】:

  • LEFT JOINWHERE IS NULL

标签: sql ms-access outer-join


【解决方案1】:

试试这个:

  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 的记录,当没有找到匹配的服务记录时会发生这种情况

【讨论】:

  • 能否请您解释一下为什么这有效,而不是我原来的@sparky?
  • 我修改了答案以提供描述
【解决方案2】:

添加以下内容应该可以:

WHERE S.EmployeeID is null

使用left join 而不是right

【讨论】:

  • 不够。需要进行两项更改。
  • @PM77-1 我输入的内容与接受的答案没有什么不同,我只是没有输入所有代码,而是提到它需要使用左连接。没有实际阅读完整答案的否决票是非常粗鲁的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2012-12-02
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多