PostgreSQL DBA(35) - CTE
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,CTE(Common Table Expressions)是指使用WITH语句定义的通用表表达式。如:testdb=# explain verbose WITH t1 AS ( SELECT * FR
千家信息网最后更新 2026年10月31日PostgreSQL DBA(35) - CTE
CTE(Common Table Expressions)是指使用WITH语句定义的通用表表达式。
如:
testdb=# explain verbose WITH t1 AS ( SELECT * FROM t_w1 WHERE t_w1.id % 4 = 0 ) SELECT * FROM t1 JOIN t_w2 as t2 ON t2.id = t1.id; QUERY PLAN -------------------------------------------------------------------------- Hash Join (cost=167.74..359.00 rows=76 width=70) Output: t1.id, t1.c1, t2.id, t2.c1 Hash Cond: (t2.id = t1.id) CTE t1 -> Seq Scan on public.t_w1 (cost=0.00..166.50 rows=38 width=8) Output: t_w1.id, t_w1.c1 Filter: ((t_w1.id % 4) = 0) -> Seq Scan on public.t_w2 t2 (cost=0.00..153.00 rows=10000 width=8) Output: t2.id, t2.c1 -> Hash (cost=0.76..0.76 rows=38 width=62) Output: t1.id, t1.c1 -> CTE Scan on t1 (cost=0.00..0.76 rows=38 width=62) Output: t1.id, t1.c1(13 rows)使用CTE可以:
1.增强SQL的可读性:如上例所示,通过CTE,可以"模块化"SQL语句,增强脚本可读性
2.实现递归:通过增加RECURSIVE修饰符来引入它自己,从而实现递归
递归
递归通常用于处理逻辑上存在层次或树状结构的数据.
如:
drop table if exists t_cte;create table t_cte(id varchar(10),parent_id varchar(10));insert into t_cte values('1',NULL);insert into t_cte values('11','1');insert into t_cte values('12','1');insert into t_cte values('111','11');insert into t_cte values('112','11');insert into t_cte values('121','12');id为数据表的id,parent_id是该id的父id,通过该字段可找到对应的父记录,先要求打印这些数据的树状结构,相应的SQL语句如下:
WITH RECURSIVE ret AS( SELECT parent_id, id::text as name, id::text FROM t_cte WHERE id = '1' UNION ALL SELECT t.parent_id, t.parent_id || ' > ' || t.id as name, t.id FROM ret JOIN t_cte t ON t.parent_id = ret.id)SELECT parent_id, name FROM ret;WITH RECURSIVE语句包含两个部分
1.non-recursive term(非递归部分)
即上例中的:
SELECT parent_id, id::text as name, id::text FROM t_cte WHERE id = '1'2.recursive term(递归部分)
即上例中的:
SELECT t.parent_id, t.parent_id || ' > ' || t.id as name, t.id FROM ret JOIN t_cte t ON t.parent_id = ret.id执行步骤如下
1.执行non-recursive term。其结果作为recursive term中对ret的引用,同时将这部分结果放入工作表中
2.重复执行如下步骤,直到工作表为空:用工作表的内容替换递归的自引用(上例中的ret),执行recursive term,并用该结果替换工作表
大凡递归, 必须有结束条件,工作表为空则是CTE Recursive的结束条件.就上例来说,
SELECT t.parent_id, t.parent_id || ' > ' || t.id as name, t.id FROM ret JOIN t_cte t ON t.parent_id = ret.id返回为空时,递归结束.
递归
工作
语句
数据
结果
部分
可读性
条件
步骤
结构
两个
内容
同时
如上
字段
层次
数据表
模块
脚本
表达式
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
南京欣网互联网络科技有限公司
河南云网互联网络科技有限公司
疫情对互联网科技公司影响
金融科技 互联网金融
中国 科技 互联网
汇久创客互联网科技
北京禾田雨橡互联网科技
新浪科技互联网
重庆科技学院互联网
居家互联网科技有限公司
深圳市运趣互联网科技有限公司
以后互联网后是啥科技
汽车互联网创新科技园
互联网科技创新服务
国大互联网教育科技有限公司工作
烟台灵鸽互联网科技有限公司
小米互联网科技园入驻
35岁以上互联网科技行业
互联网科技包装股
福州德业互联网科技
互联网金融科技
上海挚品互联网科技有限公司
江苏根荣互联网科技
互联网巨头科技公司
贷财互联网科技
天下捷融互联网科技
上游互联网科技
恒生互联网科技指数跳水
互联网领先科技活动
互联网科技快速发展优美句子