Menu
CoddyTech

一个数字序列

本课属于 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 本身。

challenge icon

挑战

简单

编写一个名为 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

进阶内容中的所有课

自己练习: SQL 在线编辑器