19.1.2 递归CTE
递归CTE的子查询可以引用自身,递归CTE的语法格式比非递归CTE的语法格式多一个关键字RECURSIVE。
WITH RECURSIVE
cte_name [(col_name [, col_name] ...)] AS (subquery)
[, cte_name [(col_name [, col_name] ...)] AS (subquery)] …
SELECT [(col_name [, col_name] ...)] FROM cte_name;
在递归CTE中,子查询包含两种:一种是种子查询(种子查询会初始化查询数据,并在查询中不会引用自身),一种是递归查询(递归查询是在种子查询的基础上,根据一定的规则引用自身的查询)。这两个查询之间会通过UNION、UNION ALL或者UNION DISTINCT语句连接起来。
例如,使用递归CTE在MySQL命令行中输出1~10的序列。
mysql> WITH RECURSIVE cte_num(num) AS
-> (
-> SELECT 1
-> UNION ALL
-> SELECT num + 1 FROM cte_num WHERE num < 10
-> )
-> SELECT * FROM cte_nu