1.代码
例如:生成"2023-03-01"至"2023-03-10"之间的日期
WITH RECURSIVE date_range AS (
SELECT "2023-03-01" AS date FROM dual
UNION ALL
SELECT DATE_ADD(date, INTERVAL 1 DAY) date
FROM date_range
WHERE DATE_ADD(date, INTERVAL 1 DAY) <= "2023-03-10"
)
SELECT
date
FROM
date_range ;
生成结果:
2. 语法
在SQL中,RECURSIVE关键字并不直接接受参数,它是一个用于定义递归公用表表达式(Recursive Common Table Expression, CTE)的关键字。递归CTE通常包含两个部分:
1.基础集(Non-Recursive Part): 这是递归查询的初始或起始点,它不依赖于自身生成的结果。这个部分通常是单个SELECT语句。
2.递归集(Recursive Part): 这是递归查询的核心部分,它引用了前面已经计算出的结果,并结合新的数据行生成下一次迭代的数据。递归集通常通过UNION ALL、UNION(去除重复行)或者在某些数据库系统中支持的其他方式与基础集连接。
例如,在MySQL中的一个递归查询结构如下,递归遍历树结构:
WITH RECURSIVE hierarchy AS (
SELECT id, parent_id, name, 1 as level
FROM tree
WHERE parent_id IS NULL -- 基础集:根节点
UNION ALL
SELECT child.id, child.parent_id, child.name, h.level + 1
FROM tree AS child
JOIN hierarchy AS h ON h.id = child.parent_id -- 递归集:基于前一次结果继续查询
)
SELECT * FROM hierarchy;