每日一题-34(找到遗失的ID)

题34:

根据下表写一个SQL语句,找到所有遗失的顾客id,遗失的顾客id是指那些不在Customers表中,值却处于1和表中最大customer_id之间的id。返回结果按ids升序排列。
在这里插入图片描述
解题思路:通过递归生成序列表,然后序列表与顾客表外连接后找筛选出剩余的id即可。
(1)先生成序列表:

with recursive a as
(select 1 as ids
union all
select ids+1 from a
where ids<(select max(customer_id) from Customers))

(2)再用序列表与顾客表外连接筛选出剩余的id:

select a.ids
from a left join Customers as b on a.ids=b.customer_id
where b.customer_name is null;

最终代码:

with recursive a as
(select 1 as ids
union all
select ids+1 from a
where ids<(select max(customer_id) from Customers))

select a.ids
from a left join Customers as b on a.ids=b.customer_id
where b.customer_name is null;

本题知识点:WITH AS短语

WITH AS短语,也叫做子查询部分,能够做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。
WITH AS子句的功能:是定义SQL语句级的临时表、该临时表仅对本次执行的SQL有效
作用:

  • 可以把复杂SQL语句按照特定的业务逻辑分成几个WITH AS临时表、再用这些临时表组成完整的SQL语句,从而提高SQL语句的可读性和编写。
  • 把一大堆重复用到的SQL语句放在with as里面,取一个别名,后面的查询就可以用它、从而减少SQL语句的长度、从而大幅提高SQL的执行效率和可读性。

with recursive是一个递归的查询子句,他会把查询出来的结果再次代入到查询子句中继续查询。

猜你喜欢

转载自blog.csdn.net/Txixi/article/details/121768639