前言
练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。
今日题目:
1965.丢失信息的雇员
表:Employees
列名 | 类型 |
---|---|
employee_id | int |
name | varchar |
employee_id 是该表中具有唯一值的列。
每一行表示雇员的 id 和他的姓名。息。
表:Salaries
列名 | 类型 |
---|---|
employee_id | int |
salary | int |
employee_id 是该表中具有唯一值的列。
每一行表示雇员的 id 和他的薪水。
编写解决方案,找到所有 丢失信息 的雇员 id。当满足下面一个条件时,就被认为是雇员的信息丢失:
- 雇员的 姓名 丢失了,或者
- 雇员的 薪水信息 丢失了
返回这些雇员的 id employee_id , 从小到大排序 。
我那不值一提的想法:
- 首先梳理表内容,题干一共给了两张表,一张雇员表,一张薪水表,其中雇员表记录了员工id,姓名,其中薪水表记录了员工id和薪水,两张表可以用员工id相连接
- 其次分析需求,需要找到所有丢失的雇员id,丢失的条件就是姓名或薪水信息丢失
- 我的基本思路就是要找到第一张表有第二张表没有和第一张表没有第二张表有的数据
- 首先计算第一张表有,第二张表没有的数据,也就是左连接,这样没有的数据就会显示null,我们利用筛选条件
where e.name is null or s.salary is null
,就能得到第一张表有,第二张表没有的数据 - 其次计算第一张表没有,第二张表有的数据,也就是右连接,同样,没有的数据就会显示null,利用同样的筛选条件得到第一张表有,第二张表没有的数据
- 然后利用union将两个的结果结合起来,就得到了最终结果
- 最后将上述所有括起来形成一个临时表,然后再查询,对其进行整体的排序
select *
from
(select e.employee_id
from Employees e
left join Salaries s on e.employee_id = s.employee_id
where e.name is null or s.salary is null
union
select s.employee_id
from Employees e
right join Salaries s on e.employee_id = s.employee_id
where e.name is null or s.salary is null
) as result
order by employee_id
结果:
总结:
能运行就行。