[每日一练]利用子查询配合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
相关推荐
银发控、4 小时前
MySQL联合索引
数据库·mysql
予枫的编程笔记4 小时前
【MySQL修炼篇】从踩坑到精通:事务隔离级别的3大异常(脏读/幻读/不可重复读)解决方案
数据库·mysql·后端开发·数据库事务·事务隔离级别·rr级别·脏读幻读不可重复读
数研小生5 小时前
构建命令行单词记忆工具:JSON 词库与艾宾浩斯复习算法的完美结合
算法·json
芒克芒克5 小时前
LeetCode 题解:除自身以外数组的乘积
算法·leetcode
一起养小猫5 小时前
Flutter for OpenHarmony 实战:记账应用数据统计与可视化
开发语言·jvm·数据库·flutter·信息可视化·harmonyos
世界尽头与你5 小时前
(修复方案)CVE-2023-22047: Oracle PeopleSoft Enterprise PeopleTools 未授权访问漏洞
数据库·安全·oracle·渗透测试
韩立学长5 小时前
【开题答辩实录分享】以《智能大学宿舍管理系统的设计与实现》为例进行选题答辩实录分享
数据库·spring boot·后端
Python 老手5 小时前
Python while 循环 极简核心讲解
java·python·算法
Henry Zhu1235 小时前
数据库(五):反规范化
数据库
@Aurora.5 小时前
优选算法【专题九:哈希表】
算法·哈希算法·散列表