MYSQL 8.0 新特性-递归CTE

本文探讨了使用SQL递归查询解决层级数据的问题,通过两种不同的递归查询方式对比,展示了如何从底层向上查找以及从顶层向下遍历层级结构,提高了查询效率。

直接生成连续的数字

WITH recursive a (x) AS 
( SELECT 1 
UNION ALL
SELECT x + 1 FROM a WHERE x < 10 ) 
SELECT * FROM a;

在这里插入图片描述

层级查询

测试数据示例

图形展示如下
在这里插入图片描述
数据库数据如下

idnameparent_id
1a
2b1
3c1
4d2
5e3
6f3
WITH RECURSIVE a(id,name,parent_id,path) AS 
(
SELECT 
	id,name,parent_id,name as path 
FROM 
	test1
UNION ALL
SELECT 
	a.id,a.name,b.parent_id,concat(b.name,"->",path) as path 
FROM 
	a,test1 b 
WHERE 
	a.parent_id is not null 
	and 
	a.parent_id=b.id
) 
SELECT id,name,path FROM a where parent_id is null;
--上面这种方式从底层出发,往上层找,直到找到parent_id为空的记录,复杂度比较高
--下面的sql从最高级往下找,执行速度比上面的sql要快
WITH RECURSIVE a(id, NAME, parent_id, path) AS (
	SELECT
		id,
		NAME,
		parent_id,
		NAME AS path 
	FROM
		test1 
	WHERE
		parent_id IS NULL UNION ALL
	SELECT
		b.id,
		b.NAME,
		b.parent_id,
		concat( a.path, "->", b.NAME ) AS path 
	FROM
		a,
		test1 b 
	WHERE
		a.id = b.parent_id 
	) SELECT
	id,
	NAME,
	parent_id,
	path 
FROM
	a;

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值