PostgreSQL - update语句怎么关联多个表
问题
对于select语句,我们可以通过join/outer join来关联多个表;但是对于update语句,是不能直接通过join/outer join来关联多表数据的,这里仅针对PostgreSQL。
或者说,在PostgreSQL中,就算使用update+join不会报错,但join的那部分其实是没任何效果的,如下所示:
update a
set value = 'test'
from a
join b on a.b_id = b.id
join c on b.c_id = c.id
where
a.key = 'test'
and c.value = 'test';
按照上边的sql,本意是a、b、c三表关联,当c的value是'test'且a的key也是'test'的时候,就将a的value也改为'test'。但实际上这个sql有大问题,这里的join和where条件并没有意义,一旦update成功,你会发现,a表内的所有数据的value都被改成了'test'!!要么update 0条数据,要么全部update!至于是哪种结果,这要看where的条件,目前还不清楚为什么会这样。因为这种写法本身就是不对的!
PostgreSQL中正确的多表关联update写法
在update语句中不应该通过join来进行多表关联,而是要通过from来多表关联,如下:
update a
set value = 'test'
from b,c
where
a.b_id = b.id
and b.c_id = c.id
and a.key = 'test'
and c.value = 'test';
通过from来多表关联,而关联条件则是放到了where中,这样就可以达到我们想要的效果了。另外补充一句,对于set xxx = 'xxx'这个update的部分,是不可以在column字段前加上表前缀的,比如下边的写法就是有语法错误的:
update a
set a.value = 'test';
参考链接
PostgreSQL - update语句怎么关联多个表的更多相关文章
- Mysql update语句赋值嵌套与在表列中数据后面增加数据
1.Mysql update语句赋值嵌套select 点击(此处)折叠或打开 update a set col=(select col from a where id='5') where id&g ...
- 当更新user表时,页面没有的属性,执行update语句不会更改以前的值
当更新user表时,页面没有的属性,执行update语句不会更改数据库表的值.不会用NULL值去填充
- Oracle Update 语句语法与性能分析 - 多表关联
Oracle Update 语句语法与性能分析 - 多表关联 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...
- ORACLE多表关联UPDATE 语句
转载至:http://blog.itpub.net/29378313/viewspace-1064069/ 为了方便起见,建立了以下简单模型,和构造了部分测试数据:在某个业务受理子系统BSS中, SQ ...
- 利用带关联子查询Update语句更新数据
Update是T-sql中再简单不过的语句了,update table set column=expression [where condition],我们都会用到.但update的用法不仅于此,真 ...
- SQL语句分组排序,多表关联排序
SQL语句分组排序,多表关联排序总结几种常见的方法: 案例一: 在查询结果中按人数降序排列,若人数相同,则按课程号升序排列? 分析:单个表内的多个字段排序,一般可以直接用逗号分割实现. select ...
- [转]两表join的multi update语句在MySQL中的执行流程分析
出自:http://hedengcheng.com/?p=209 两表join的multi update语句,执行结果与预计不一致的分析过程 — multi update结论在实际应用中,不要轻易使用 ...
- Oracle 表关联性 Update 语句的改写,推荐改写方法1
同事写了一个逻辑稍复杂的Update 语句,觉得在代码可读性上有些转圈,交给我帮忙改下. 以下根据原SQL,使用两种方法进行改写,个人推荐方法1的改写.方法2拆分两个SQL来写,代码可读性最强,但是S ...
- SQL update语句 更新和查询同一张表 冲突
#update 和 select在同一张表的时候会显示冲突 报错信息: [Err] 1093 - You can't specify target table 'tb_a' for update i ...
随机推荐
- 20170316 ABAP注意点
1.debug 时在MODIFY db from table 后数据便提交了: 一般情况下,更新数据库需要commit,但debug会自动commit,程序结束也会自动commit. 2.使用at n ...
- appium(7)-Automating mobile gestures
While the Selenium WebDriver spec has support for certain kinds of mobile interaction, its parameter ...
- s:text
<s:text>是Struts2用来显示资源文件中信息或格式化数据时使用的,一般要配合<s:i18n>标签.
- Android Weekly Notes Issue #243
Android Weekly Issue #243 February 5th, 2017 Android Weekly Issue #243 本期内容包括: ConstraintLayout的动画; ...
- mysql优化20条原则
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...
- 使用Node.js实现简单的网络爬取
由于最近要实现一个爬取H5游戏的代理服务器,隧看到这么一篇不错的文章(http://blog.miguelgrinberg.com/post/easy-web-scraping-with-nodejs ...
- JNI——C调用JAVA
步骤: 1. 创建虚拟机 2. 获得class 3. 实例化对象:获得构造方法(方法名为“<init>”),构造参数,调用方法 4. 调用方法:又分为获得方法,构造方法,调用方法 操作方法 ...
- MTK OTG 流程
一.注册mt_usb驱动 kernel-3.18/drivers/misc/mediatek/usb20/mt6735/usb20.c static int __init usb20_init(voi ...
- 如何用vs2013开发人员命令提示工具执行一个方法(一个简单的demo)
在任何一个编辑器中编写一个静态的Main方法,必须是静态且名为Main的方法,并将Main方法所在的类文件命名为yang.cs(这个名字随便命名),如图-1. 图-1 打开你的vs2013开发人员命令 ...
- 8、html的body内标签之fieldset标签和label标签
一.label标签 <label> 标签为 input 元素定义标签(label). label 元素不会向用户呈现任何特殊的样式.不过,它为鼠标用户改善了可用性,因为如果用户点击 lab ...