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 ...
随机推荐
- redis 使用 get 命令读取 bitmap 类型的数据
在签到统计场景中,可以使用 bitmap 数据类型高效的存储签到数据,但 getbit 命令只能获取某一位值,就无法最优的满足部分业务场景了. 比如我们按年去存储一个用户的签到情况,365 天,只需要 ...
- HTML中级教程 元标签
元标签对浏览器窗口中的内容不做任何事情,它们用在关于页面的像搜索引擎的归类目录信息中. 元标签meta可以使用尽可能多次如你所需,包括内容属性content(必须的).名称属性name和http-eq ...
- Package 'sun-java6-jdk' has no installation candidate 解决方式【转】
本文转载自:http://www.cnblogs.com/changefuture/archive/2012/06/19/2554876.html 解决方式: sudo add-apt-reposit ...
- Gym - 101147E E. Jumping —— bfs
题目链接:http://codeforces.com/gym/101147/problem/E 题意:当人在第i个商店时,他可以向左或向右跳di段距离到达另一个商店(在范围之内),一个商店为一段距离. ...
- 纯属娱乐,对入门Android有一定的帮助
package android.m9; import android.app.Activity; import android.os.Bundle; import android.view.Men ...
- ansible管理windows实践
一.前言 近期打算搞搞自动部署,因为是windows服务器,一些工具和系统支持都不是太好.最后发现ansible比较火,最重要的是他支持windows.本文主要就ansible 在windows使用环 ...
- 「IOI1998」「LuoguP4342」Polygon(区间dp
P4342 [IOI1998]Polygon - 洛谷 题意翻译 题目可能有些许修改,但大意一致 多边形是一个玩家在一个有n个顶点的多边形上的游戏,如图所示,其中n=4.每个顶点用整数标记,每个边用符 ...
- [SHOI 2007] 善意的投票
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1934 [算法] 首先 , 选择睡觉的人和不选择睡觉的人构成两个集合 这启发我们用最小 ...
- JNI——C调用JAVA
步骤: 1. 创建虚拟机 2. 获得class 3. 实例化对象:获得构造方法(方法名为“<init>”),构造参数,调用方法 4. 调用方法:又分为获得方法,构造方法,调用方法 操作方法 ...
- springboot开启远程调试
远程调试maven设置 The run goal forks a process for the boot application. It is possible to specify jvm arg ...