[每日一练]利用子查询配合union all进行全连接后丢失数据的查询

#该题目来源于力扣:

1965. 丢失信息的雇员 - 力扣(LeetCode)

题目要求:

复制代码
表: Employees

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| employee_id | int     |
| name        | varchar |
+-------------+---------+
employee_id 是该表中具有唯一值的列。
每一行表示雇员的 id 和他的姓名。
表: Salaries

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| employee_id | int     |
| salary      | int     |
+-------------+---------+
employee_id 是该表中具有唯一值的列。
每一行表示雇员的 id 和他的薪水。
 

编写解决方案,找到所有 丢失信息 的雇员 id。当满足下面一个条件时,就被认为是雇员的信息丢失:

雇员的 姓名 丢失了,或者
雇员的 薪水信息 丢失了
返回这些雇员的 id  employee_id , 从小到大排序 。

查询结果格式如下面的例子所示。

 

示例 1:

输入:
Employees table:
+-------------+----------+
| employee_id | name     |
+-------------+----------+
| 2           | Crew     |
| 4           | Haven    |
| 5           | Kristian |
+-------------+----------+
Salaries table:
+-------------+--------+
| employee_id | salary |
+-------------+--------+
| 5           | 76071  |
| 1           | 22517  |
| 4           | 63539  |
+-------------+--------+
输出:
+-------------+
| employee_id |
+-------------+
| 1           |
| 2           |
+-------------+
解释:
雇员 1,2,4,5 都在这个公司工作。
1 号雇员的姓名丢失了。
2 号雇员的薪水信息丢失了。

思路流程:

看到这道题的第一反应就是将这两个数据集全连接起来,然后查询空值就行了。但是MySQL有一个特性,它不支持全部外连接,只支持左右外连接。克服这个问题,可以分别进行查询,最后使用union all/unio 进行连接。

回到题目,他要求我们查询一个员工所丢失的数据,在两张表中,未出现的的数据就是丢失的信息。使用左右连接再继续联合查询太耗时间。我们可以直接利用子查询,通过 in/not in的判断,来直接判断出再一个表中出现的id在另一张表中是否出现,我们要查询缺失值。具体代码如下:

sql 复制代码
SELECT ID FROM 表1
where ID NOT IN (SELECT ID FROM 表2)

这样就可以查询出表1缺失的数据了。想要查询表2缺失的数据也很容易,对调上面代码"表1"和"表2"的位置就行了。最后用union all/union连接即可:

sql 复制代码
SELECT ID FROM 表1
WHERE ID NOT IN (SELECT ID FROM 表2)
UNION ALL
SELECT ID FROM 表2
WHERE ID NOT IN (SELECT ID FROM 表1)
UNION ALL
......

代码实现:

明白了实现形式,我们将数据传入代码即可:

sql 复制代码
SELECT employee_id FROM Employees
WHERE employee_id NOT IN (SELECT employee_id FROM Salaries)
UNION ALL
SELECT employee_id FROM Salaries
WHERE employee_id NOT IN (SELECT employee_id FROM Employees)
ORDER BY employee_id ASC
相关推荐
人道领域10 分钟前
【LeetCode刷题日记】669.修剪二叉搜索树
开发语言·python·算法
JAVA面经实录91728 分钟前
Hibernate面试题库
数据库·oracle·hibernate
2301_7736436243 分钟前
华为云存储实验
网络·mysql·华为云
迷枫7121 小时前
DM8 目录结构与常用排查入口梳理
服务器·数据库
QiLinkOS1 小时前
【从实验室到商业战场:发明专利如何重塑科技与企业的共生生态】
大数据·c语言·数据结构·c++·人工智能·单片机·算法
小白兔奶糖ovo2 小时前
【Leetcode】231. 2的幂
linux·算法·leetcode
xiaoxiaoxiaolll2 小时前
《Light: Science & Applications》合并BIC实现80倍阈值单模运行:超紧凑光子晶体激光器新突破
人工智能·算法·机器学习
Mr.Daozhi2 小时前
RAG 进阶实战:跑通 Demo 后我连续翻了 6 次车,逐一修复才真正可用(含 Gradio Web 版)
前端·数据库·langchain·大模型·gradio·rag·科研工具
Peter·Pan爱编程2 小时前
14. Lambda 表达式:随手可写的函数对象
c++·算法·ai编程
-To be number.wan2 小时前
算法日记 | 暴力枚举
学习·算法