1、递归CTE由三个主要部分组成:
- 形成CTE结构的基本结果集的初始查询(initial_query),初始查询部分被称为锚成员。
- 递归查询部分是引用CTE名称的查询,因此称为递归成员。递归成员由一个UNION ALL或
UNION DISTINCT
运算符与锚成员相连。 - 终止条件是当递归成员没有返回任何行时,确保递归停止。
1、1 递归CTE的执行顺序如下:
- 首先,将成员分为两个:锚点和递归成员。
- 接下来,执行锚成员形成基本结果集(
R0
),并使用该基本结果集进行下一次迭代。 - 然后,将
Ri
结果集作为输入执行递归成员,并将Ri+1
作为输出。 - 之后,重复第三步,直到递归成员返回一个空结果集,换句话说,满足终止条件。
- 最后,使用
UNION ALL
运算符将结果集从R0
到Rn
组合。
2、递归成员限制
递归成员不能包含以下结构:
- 聚合函数,如MAX,MIN,SUM,AVG,COUNT等
- GROUP BY子句
- ORDER BY子句
- LIMIT子句
- DISTINCT
3. 简单的MySQL递归CTE示例
WITH RECURSIVE cte_count (n) AS ( SELECT 1 UNION ALL SELECT n + 1 FROM cte_count WHERE n < 3 ) SELECT n FROM cte_count;