全部术语

公用表表达式(CTE)

PostgreSQL 中的 CTE(WITH 查询)是什么?

公用表表达式用 WITH 编写,它为子查询命名,使语句的其余部分可以像使用表一样使用它。WITH RECURSIVE 可以处理树形结构和层级关系。

公用表表达式(CTE)是 WITH 子句中的辅助语句,为单个查询定义一个临时的命名结果。它能把复杂的查询拆分为易读的步骤,辅助语句也可以是执行插入、更新或删除的数据修改语句(INSERT、UPDATE 或 DELETE)。

WITH RECURSIVE 允许 CTE 引用自身的输出,这是遍历汇报关系或嵌套分类等层级结构的标准方式。对于非递归、无副作用且只被查询引用一次的 CTE,会将其折叠到外层查询中,以便两者一起优化。添加 MATERIALIZED 可让它单独求值,添加 NOT MATERIALIZED 则要求进行折叠。

示例

该示例从一名员工开始,用 WITH RECURSIVE 沿管理链逐级向上查找,返回每个人及其与起点之间的距离。

CREATE TABLE employees (
  id int PRIMARY KEY,
  name text NOT NULL,
  manager_id int REFERENCES employees (id)
);
INSERT INTO employees VALUES (1, 'Ana', NULL), (2, 'Ben', 1), (3, 'Chen', 2), (4, 'Dee', 1);

WITH RECURSIVE chain AS (
  SELECT id, name, manager_id, 1 AS depth FROM employees WHERE id = 3
  UNION ALL
  SELECT e.id, e.name, e.manager_id, c.depth + 1
  FROM employees e JOIN chain c ON e.id = c.manager_id
)
SELECT name, depth FROM chain ORDER BY depth;

适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。

参考资料

PostgreSQL 官方文档(英文)。

相关术语