SuperAPI AI 工具集

postgres-syntax-cte-recursive

数据与分析

查看项目

更新于 10-15 22:18

技能介绍

用途:本技能面向 PostgreSQL 的 WITH 公共表表达式(CTE)语法,适用于编写可读的多阶段查询、遍历父子(树)或多对多(图)关系,以及在一条原子语句中组合 INSERT/UPDATE/DELETE 与 SELECT。

主要能力: 非递归 CTE:WITH name AS (...) 把查询分解为命名、有序、可复用的阶段,等价于 FROM 子句中的子查询。 递归 CTE:WITH RECURSIVE a AS (anchor UNION ALL recur),用于树遍历、图遍历和生成序列。递归分支最终必须返回零行才能终止。 v14+ SEARCH 与 CYCLE 子句:SEARCH {DEPTH|BREADTH} FIRST BY col SET ord 生成遍历顺序列;CYCLE col SET is_cycle USING path 自动检测并打断环。 数据修改 CTE:WITH a AS (INSERT/UPDATE/DELETE ... RETURNING *) SELECT ...,让单条语句执行 DML 并向下游暴露受影响行。

必要用法与关键规则:

  1. v12 起,引用一次且无副作用的非递归 CTE 默认内联(NOT MATERIALIZED)。若依赖优化栅栏,需显式写 AS MATERIALIZED (...) ,例如防止重复执行昂贵函数。
  2. 递归分支只能引用 CTE 名一次(v15–v17),自连接会报 42P19。
  3. 递归分支不可含跨递归引用的聚合、ORDER BY、LIMIT/OFFSET、FOR UPDATE/FOR SHARE。
  4. 同一 WITH 中所有子语句共享同一快照,一个 CTE 的写入对其他 CTE 不可见;数据修改 CTE 必须位于 WITH 顶层且需 RETURNING。
  5. WITH 中不支持 MERGE。
  6. 图数据有环时必须用 CYCLE 子句、手工 visited-set 或深度上限终止。

适用场景:树/图遍历、无 generate_series 的序列生成、读写合一的归档或审计、调试 CTE 被重复执行或递归不返回等问题。

限制:不适用于窗口函数、LATERAL 连接、物化视图;删除时同一 CTE 的写不可见,有顺序要求时应改用多条语句。官方文档链接见资料,版本行为在 v15–v17 稳定。