sql - SQL如何拉入所有不包含的记录
问题描述
这是一个有点棘手的问题来解释,但我会尽力而为。
问题的本质是我有一个员工工资表,列是这样的:员工 ID、工资月份、工资(货币)。
我想运行一个选择,它将向我显示所有没有 X 个月记录的员工。
我附上了一张图片来帮助对此进行可视化,下面是 UI 想要从这些数据中获得什么的示例:
假设从这个小例子中,我想查看所有在 2021 年 10 月 1 日未获得报酬的员工。从外观上,我知道员工 3 是唯一获得报酬的员工,而员工 1 和 2 没有获得报酬。我如何能够在更大范围的数据上查询这个而不知道他们可能是哪一个月没有得到报酬?
解决方案
您需要将 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
推荐阅读
- javascript - Pug / Jade:在 list-group-item 内容之前添加 font-awsome 按钮
- elasticsearch - 从远程服务器向 Elasticsearch 传递数据
- ruby-on-rails - 根据用户状态显示或隐藏“高级功能”的最佳实践?
- android-ffmpeg - “ffmpeg -i test.mp4 -vf drawtext=fontfile=arial.ttf:text=welcome output.mp4”,“-vf”是什么意思?
- html - 鼠标悬停会使顶部栏中的文本和图标从网站上消失
- npm - npm WARN eslint-plugin-vue@6.2.2 需要 eslint@^5.0.0 的 peer || ^6.0.0 但未安装
- android - Firestore 规则 - 查询文档字段而不暴露整个集合
- c# - 将对象移动到其面对的方向给定的距离c#
- python-sphinx - 从标签和参考自动生成索引
- php - 如何在 WooCommerce 管理订单列表中的新列中添加“Local Pickup Plus 取货日期”