一个数字序列
本课属于 Coddy SQL 学习旅程的“进阶内容”单元。第 20 课,共 27 课。
你在 Fundamentals 中学过 WITH 关键字,它可以为子查询命名。子查询也称为 CTE(通用表表达式)。递归 CTE 更进一步:它允许子查询引用自身,逐行构建结果。
最简单的版本无需依赖底层表,就能生成一个数字序列。结构始终相同:
WITH RECURSIVE counter(n) AS (
SELECT 1 -- 起始部分:生成第一行
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5 -- 递归部分:根据上一行生成下一行
)
SELECT n FROM counter可以这样理解:从 n = 1 开始,然后不断添加行,让每个 n 都等于前一个 n + 1,直到 WHERE 不再匹配为止。结果是 1, 2, 3, 4, 5。
主体的两部分通过 UNION ALL 连接。第一部分是锚点:种子行。第二部分是递归步骤:它会查询 CTE 本身。
挑战
简单编写一个名为 powers、包含两列的递归 CTE:
i:迭代索引,从1开始p:2的i次幂(2、4、8、…)
当 p 将超过 1000 时停止。返回这两列,并按 i 升序排列。
亲手试试
WITH RECURSIVE powers(i, p) AS (
-- 起始项:i=1,p=2
-- 递归项:i+1,p*2,直到 p 达到 1000
)
SELECT i, p FROM powers ORDER BY i
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
进阶内容中的所有课
自己练习: SQL 在线编辑器