首页 > 解决方案 > SQL如何拉入所有不包含的记录

问题描述

这是一个有点棘手的问题来解释,但我会尽力而为。

问题的本质是我有一个员工工资表,列是这样的:员工 ID、工资月份、工资(货币)。

我想运行一个选择,它将向我显示所有没有 X 个月记录的员工。

我附上了一张图片来帮助对此进行可视化,下面是 UI 想要从这些数据中获得什么的示例:

假设从这个小例子中,我想查看所有在 2021 年 10 月 1 日未获得报酬的员工。从外观上,我知道员工 3 是唯一获得报酬的员工,而员工 1 和 2 没有获得报酬。我如何能够在更大范围的数据上查询这个而不知道他们可能是哪一个月没有得到报酬?

在此处输入图像描述

标签: sqlsql-server

解决方案


您需要将 EmployeeSalary 表与预期的 EmployeeID/MonthOfSalary 值列表连接起来,并确定差距 - EmployeeSalary 表中没有匹配记录的实例。可以在这里使用 LEFT OUTER JOIN,只要 EmployeeSalary 表中没有匹配记录/缺失记录,LEFT OUTER JOIN 就会给你 NULL。

以下查询显示了如何执行 LEFT OUTER JOIN,但请注意,我已将您的表连接到自身以获取 EmployeeID 和 MonthOfSalary 值的列表。你最好从其他表中加入这些,即我假设你有一个包含所有 ID 的 Employee 表,这比从 EmployeeSalary 表构建 ID 列表更有效(也更准确)(比如我已经搞定了)。

SELECT EmployeeList.EmployeeID, MonthList.MonthOfSalary
FROM (SELECT DISTINCT MonthOfSalary FROM EmployeeSalary) MonthList
JOIN (SELECT DISTINCT EmployeeID FROM EmployeeSalary) EmployeeList
LEFT OUTER JOIN EmployeeSalary 
  ON MonthList.MonthOfSalary = EmployeeSalary.MonthOfSalary
 AND EmployeeList.EmployeeID = EmployeeSalary.EmployeeID
WHERE EmployeeSalary.EmployeeID IS NULL

推荐阅读