#该题目来源于力扣:
题目要求:
表: 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在另一张表中是否出现,我们要查询缺失值。具体代码如下:
SELECT ID FROM 表1
where ID NOT IN (SELECT ID FROM 表2)
这样就可以查询出表1缺失的数据了。想要查询表2缺失的数据也很容易,对调上面代码“表1”和“表2”的位置就行了。最后用union all/union连接即可:
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
......
代码实现:
明白了实现形式,我们将数据传入代码即可:
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