【MySQL】MySQL版本8+ 的 with recursive 递归语法初次使用

力扣题

1、题目地址

1613. 找到遗失的ID

2、模拟表

表:Customers

Column NameType
customer_idint
customer_namevarchar
  • customer_id 是该表主键.
  • 该表第一行包含了顾客的名字和 id.

3、要求

  • 编写一个解决方案, 找到所有遗失的顾客 id。遗失的顾客 id 是指那些不在 Customers 表中, 值却处于 1 和表中 最大 customer_id 之间的 id.
  • 注意: 最大的 customer_id 值不会超过 100.
  • 返回结果按 ids 升序 排列

4、示例

输入:

Customers 表:

customer_idcustomer_name
1Alice
4Bob
5Charlie

输出:

ids
2
3

解释:

表中最大的 customer_id 是 5,所以在范围 [1,5] 内,ID2 和 3 从表中遗失.

5、代码编写

代码
WITH RECURSIVE cte AS (
    SELECT 1 AS ids
    UNION ALL
    SELECT ids+1 FROM cte WHERE ids < ANY(SELECT customer_id FROM Customers)
)
SELECT * FROM cte
WHERE ids != ALL(SELECT customer_id FROM Customers)
代码分析

使用 with recursive as 递归语法,初始值为1,
每次只要小于 Customers 的最大值 ids < ANY(SELECT customer_id FROM Customers)就继续递增 ids+1,能够输出全部数字

WITH RECURSIVE cte AS (
    SELECT 1 AS ids
    UNION ALL
    SELECT ids+1 FROM cte WHERE ids < ANY(SELECT customer_id FROM Customers)
)
SELECT * FROM cte
| ids |
| --- |
| 1   |
| 2   |
| 3   |
| 4   |
| 5   |

之后再做一次筛选即可,只将没有的筛选出来 WHERE ids != ALL(SELECT customer_id FROM Customers)

以前文章

【MySQL】ANY函数 的巧用(筛选字段 > ANY(语句) 和 筛选字段 < ANY(语句))
【MySQL】ALL函数的巧用 以及 排序(order by)巧用 sum(条件表达式) 语法
【MySQL】MySQL版本8+ 的 with recursive 两种递归语法的使用

  • 15
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值