[每日一练]利用子查询配合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
相关推荐
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
小白男神5 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
猎头南楼5 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
这个DBA有点耶5 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G5 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备5 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远5 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark5 天前
大规模并行计算中的负载均衡算法研究4
算法