首页 > 代码库 > join update vs sub-selects update
join update vs sub-selects update
开发说使用多表关联进行更新的时候发现没有正确的更新记录(事后发现是条件问题),之前一直没怎么使用关联更新,这次看了下,发现了个问题,当返回多行记录的时候并不会像传统的子查询更新那样报错,而是随机选择一个记录进行更新(貌似最后一个?)
因此,虽然关联更新会快很多,但是要考虑的这个不确定带来的隐患。
gtlions=# create table joinupdate1(id int,name varchar(20)); NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table. HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew. CREATE TABLE gtlions=# create table joinupdate2(id int,name varchar(20)); NOTICE: Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table. HINT: The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew. CREATE TABLE gtlions=# insert into joinupdate1 values(1,'a'); INSERT 0 1 gtlions=# insert into joinupdate1 values(2,'b'); INSERT 0 1 gtlions=# insert into joinupdate2 values(1,'b'); INSERT 0 1 gtlions=# insert into joinupdate2 values(2,'b'); INSERT 0 1 gtlions=# truncate table joinupdate2; TRUNCATE TABLE gtlions=# insert into joinupdate2 values(1,'c'); INSERT 0 1 gtlions=# insert into joinupdate2 values(2,'d'); INSERT 0 1 gtlions=# select * from joinupdate1; id | name ----+------ 1 | a 2 | b (2 rows) gtlions=# select * from joinupdate2; id | name ----+------ 1 | c 2 | d (2 rows) gtlions=# begin; BEGIN gtlions=# update joinupdate1 set name=(select name from joinupdate2 where joinupdate1.id=joinupdate2.id); UPDATE 2 gtlions=# select * from joinupdate1; id | name ----+------ 1 | c 2 | d (2 rows) gtlions=# rollback; ROLLBACK gtlions=# end; WARNING: there is no transaction in progress COMMIT gtlions=# select * from joinupdate1; id | name ----+------ 1 | a 2 | b (2 rows) gtlions=# begin; BEGIN gtlions=# update joinupdate1 set name=joinupdate2.name from joinupdate2 where joinupdate1.id=joinupdate2.id; UPDATE 2 gtlions=# select * from joinupdate1; id | name ----+------ 1 | c 2 | d (2 rows) gtlions=# rollback; ROLLBACK gtlions=# insert into joinupdate2 values(1,'e'); INSERT 0 1 gtlions=# begin; BEGIN gtlions=# update joinupdate1 set name=(select name from joinupdate2 where joinupdate1.id=joinupdate2.id); ERROR: more than one row returned by a subquery used as an expression (seg0 slice2 h1:40000 pid=14123) gtlions=# rollback; ROLLBACK gtlions=# begin; BEGIN gtlions=# update joinupdate1 set name=joinupdate2.name from joinupdate2 where joinupdate1.id=joinupdate2.id; UPDATE 2 gtlions=# select * from joinupdate1; id | name ----+------ 1 | e 2 | d (2 rows) gtlions=# update joinupdate1 set name=joinupdate2.name from joinupdate2 where joinupdate1.id=joinupdate2.id; UPDATE 2 gtlions=# select * from joinupdate1; id | name ----+------ 1 | e 2 | d (2 rows) gtlions=# update joinupdate1 set name=joinupdate2.name from joinupdate2 where joinupdate1.id=joinupdate2.id; UPDATE 2 gtlions=# select * from joinupdate1; id | name ----+------ 1 | e 2 | d (2 rows) gtlions=# insert into joinupdate2 values(1,'f'); INSERT 0 1 gtlions=# update joinupdate1 set name=joinupdate2.name from joinupdate2 where joinupdate1.id=joinupdate2.id; UPDATE 2 gtlions=# select * from joinupdate1; id | name ----+------ 1 | f 2 | d (2 rows) gtlions=# rollback; ROLLBACK
-EOF-
join update vs sub-selects update
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。