Postgresql通过查询进行更新

人间太皮 2018-05-31 02:44:39
drop table IF EXISTS tb1;
drop table IF EXISTS tb2;
create TABLE tb1(
ids int,
score INT);
CREATE TABLE tb2(
ida int,
scorea INT);

INSERT INTO tb1 VALUES(1,10),(2,20),(3,30);
INSERT INTO tb2 VALUES(1,100),(2,200);

select * from tb1;
select * from tb2;

UPDATE tb1 SET score = COALESCE( b.scorea,0) from tb1 a
left join tb2 b on a.ids=b.ida ;

select * from tb1;
select * from tb2;

Postgresql不支持这种通过查询进行更新吗
...全文
1019 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2018-06-01
  • 打赏
  • 举报
回复
语句前加 EXPLAIN,也就是执行 EXPLAIN UPDATE tb1 SET score = COALESCE( b.scorea,0) from tb1 a left join tb2 b on a.ids=b.ida returning a.ids, b.ida, tb1.ids;
人间太皮 2018-06-01
  • 打赏
  • 举报
回复
引用 3 楼 zjcxc 的回复:
之前还真没注意过这个问题 通过执行计划可以看出端倪,更直观的,你用下面这个更新来输出,就歌词发现这里面其实是3个表的联接 (如果是 SQL Server ,UPDATE 的那个表会带入 FROM,这里显然没有)
UPDATE tb1 SET score = COALESCE( b.scorea,0) from tb1 a
left join tb2 b on a.ids=b.ida 
returning a.ids, b.ida, tb1.ids;
所以正确的写法是:

UPDATE tb1 SET score = COALESCE( b.scorea,0) from tb1 a
left join tb2 b on a.ids=b.ida 
where a.ids = tb1.ids;
谢谢,再请教一下,postgresql的执行计划怎么看,我是windows版的
zjcxc 2018-06-01
  • 打赏
  • 举报
回复
之前还真没注意过这个问题 通过执行计划可以看出端倪,更直观的,你用下面这个更新来输出,就歌词发现这里面其实是3个表的联接 (如果是 SQL Server ,UPDATE 的那个表会带入 FROM,这里显然没有)
UPDATE tb1 SET score = COALESCE( b.scorea,0) from tb1 a
left join tb2 b on a.ids=b.ida 
returning a.ids, b.ida, tb1.ids;
所以正确的写法是:

UPDATE tb1 SET score = COALESCE( b.scorea,0) from tb1 a
left join tb2 b on a.ids=b.ida 
where a.ids = tb1.ids;
php17 2018-05-31
  • 打赏
  • 举报
回复
使用using语句试试
人间太皮 2018-05-31
  • 打赏
  • 举报
回复
结果:

952

社区成员

发帖
与我相关
我的任务
社区描述
PostgreSQL相关内容讨论
sql数据库数据库架构 技术论坛(原bbs)
社区管理员
  • PostgreSQL社区
  • yang_z_1
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧