Postgres中的Common Table Expression
Common Table Expression 是 pg 里极为重要的特性。这个特性简单的说就是 INSERT/UPDATE/DELTE 三项操作可以返回结果集。如:
update item set state = ‘A’ where state = ‘W’ returning *
update 语句通常视为 execute,而在 CTE 技术中却可以当做 query。
那么 CTE 有什么用呢?
1. 可以用于解决 upsert 问题。
Upserting via Writeable CTE - zillablog
http://xzilla.net/blog/2011/Mar/Upserting-via-Writeable-CTE.html
2. 可以避免先查询后更新的并发问题。
刚才看到有代码这样先查询符合条件的记录,再更新符合条件的记录:
select * from xx where cond
update xx set state = b where cond
先后执行两次查询,两次查询虽然是同一个cond,但前后2个查询之间可能发生难以预料的变更,命中的行集可能不同。改用 CTE 后,update 直接返回命中的行集,可消除因为前后查询不一致导致的并发问题。
3. 解决自动生成ID的取值问题。
在 oracle 里,对于自动递增主键 id,通常要先对 sequence 取下一个 id,然后再 insert,这个做法需要两次查询,效率不高,且对有 default 值的,或者 value 为函数结果的(如 sysdate),仍然无法得到新的值,往往还要执行一次 select 获得新增行的完整数据。
也就是说对于自动生成ID数据表要获得新行ID需要如下3步:
new id = select seq.nextval
insert into t (id, ..) values (new id)
select * from t where id = new id
对于一次插入多行的场景, 如(insert t select),要想得到新插入的行在 oracle 等数据库里更难表达。
引入CTE后,只需要在 insert 后加上 returning *,insert 动作就能返回新插入行的完整数据。
上面3点都是技术性问题,CTE 的重要意义不仅于此,CTE 真正的意义在于它彻底打通了所有的关系运算,利用 cte + 临时表 + with,大部分存储过程都不再需要,一个查询分步演算,就能解决所有问题——是所有问题!不是大部分问题!如对关系运算有充分理解可知此说不虚!
如欲对关系运算做更多了解,强烈推荐阅读这本:
《深度探索关系数据库:实践者的关系理论》((美)戴特 著)【简介_书评_在线阅读】 - 当当图书
http://product.dangdang.com/9309739.html?_ddclickunion=P-295132-156777_64_0__1|ad_type=0|sys_id=1#dd_refer=http%3A%2F%2Fc.duomai.com%2Ftrack.php%3Fsite_id%3D156777%26aid%3D64%26euid%3D%26t%3Dhttp%253a%252f%252fproduct.dangdang.com%252f9309739.html

这书很早了,到处都卖光了,自己找个PDF吧
Postgres中的Common Table Expression的更多相关文章
- CTE(Common Table Expression) 公用表表达式
在编写T-SQL代码时,往往需要临时存储某些结果集.前面我们已经广泛使用和介绍了两种临时存储结果集的方法:临时表和表变量.除此之外,还可以 使用公用表表达式的方法.公用表表达式(Common Tabl ...
- SQLServer中的CTE(Common Table Expression)通用表表达式使用详解
概述 我们经常会编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种方案是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-S ...
- 通用表表达式(Common Table Expression)
问题:编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句. 方案1:编写在From子句内使用派生表(内联视图)的T-SQL查询语句. 方案2:使用视图 方案3:使 ...
- with as (cte common table expression) 公共表表达式
SQL中 with as 的用法——使用公用表表达式(CTE) 公用表表达式 (CTE) 可以认为是在单个 SELECT.INSERT.UPDATE.DELETE 或 CREATE VIEW 语句的 ...
- PostgreSQL: WITH Queries (Common Table Expressions)
WITH 允许在 SELECT 语句中定义"表"的表达式,这个"表"的表达式称之为"公共表表达式(Common Table Expression)&q ...
- postgres中的视图和物化视图
视图和物化视图区别 postgres中的视图和mysql中的视图是一样的,在查询的时候进行扫描子表的操作,而物化视图则是实实在在地将数据存成一张表.说说版本,物化视图是在9.3 之后才有的逻辑. 比较 ...
- Using Recursive Common table expressions to represent Tree structures
http://www.postgresonline.com/journal/archives/131-Using-Recursive-Common-table-expressions-to-repre ...
- My Sql 中要Alter Table的同学请注意!!!
首先我建议你在对MySQL表做DDL操作时: 1 执行 show processlist 查看,要操作的表(数据库对象)是否处于锁状态 if("未锁定") { 执行DDL语句 }e ...
- html中使用js+table 实现分页
本文在html中利用js+table实现分页.主要思想是先对table中的所有数据隐藏,然后通过当前页面(currPageNum)来计算当前页要显示的行,并显示出来,首页.下一页.上一页.尾页都依此来 ...
- postgres中几个复杂的sql语句
postgres中几个复杂的sql语句 需求一 需要获取一个问题列表,这个问题列表的排序方式是分为两个部分,第一部分是一个已有的数组[0,579489,579482,579453,561983,561 ...
随机推荐
- foobar2000 v1.6.16 汉化版(2023.04.19)
foobar2000 v1.6.16 汉化版 -----------------------[软件截图]---------------------- -----------------------[软 ...
- C++第五节课 函数默认值 函数重载
#include <iostream> using namespace std; // C++的函数默认值和函数重载 // 函数参数的入栈规则从右往左开始入栈 // 函数重载机制(第一种静 ...
- 云原生周刊:K8s 在 v1.27 中移除的特性和主要变更
文章推荐 K8s 在 v1.27 中移除的特性和主要变更 随着 Kubernetes 发展和成熟,为了此项目的整体健康,某些特性可能会被弃用.移除或替换为优化过的特性.基于目前在 v1.27 发布流程 ...
- AI五子棋_06 坐标表示到图形表示的算法 Python实现
AI五子棋 第六步 恭喜你到达第六步! 你已经成功实现了公钥体系最为关键的部分.现在服务器相信你就是你了,下面开始你的战斗. 五子棋的棋盘有15×15个交点,一共有225个交点,我们可以在每一个交点上 ...
- Vulhub 安装运行
前言 vulhub是利用docker技术做的一个漏洞复现平台,可以一键搭建对应的配置.在下载好对应的代码包后,不需要安装,只需要解压并利用3条命令,就可以简单的创建关闭对应漏洞环境.最好是购买一台阿里 ...
- C++面经(持续更新)
一. c,c++区别<九大点> c: 面向过程 c++: 面向对象(封装,继承,多态) 对象:对数据和作用于数据的操作组成的封装实体 类:描叙了一组有相同属性和方法的对象<虚拟> ...
- LeetCode128 最长连续序列
最长连续序列 题目链接:LeetCode128 描述 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度. 请你设计并实现时间复杂度为 O(n) 的算法 ...
- Mysql篇-三大日志
概述 undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC. redo log(重做日志):是 Innodb 存储引擎层生成的日志, ...
- 条理清晰,浅显易懂:Lua语法技术知识详解(第三部分)
今天我们继续学习Lua语法基础教程,下篇. 9.4 函数返回值 在前面的代码中,我们实现了一个函数,输入变量a.b,函数会自动输出两个数值的和. 但是一般来说,我们的需求远远不止这些,我们可能需要一个 ...
- 【一步步开发AI运动小程序】九、姿态辅助调试桌面工具的使用
随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...