PostgreSql:为什么这个更新工作不正确?

时间:2016-09-03 15:08:11

标签: postgresql

在我需要用新值替换id时,有一个表t1。

第二个表t_changes包含替换 old_id-> NEW_ID。 但是当我执行UPDATE时,t1包含所有记录的相同新id值。 什么是不正确的? 相同的更新在T-SQL中成功运行。

drop table t1;
drop table t2;
drop table t_changes;

create table t1
(id INT,name text, new_id INT default(0));

create table t_changes
(old_id INT,new_id int)

insert into t1(id,NAME)
VALUES (1,'n1'),(2,'n2'),(3,'n3');

insert into t_changes(old_id,new_id)
values(1,11),(2,12),(3,13),(4,13)

select * from t1;
select * from t_changes;

-------!!!!
update t1
set new_id = n.new_id
from t1 t 
inner join t_changes n
on n.old_id=t.id;

select * from t1
------------------------------
"id"    "name"  "new_id"
-----------------
"1" "n1"    "11"
"2" "n2"    "11"
"3" "n3"    "11"

2 个答案:

答案 0 :(得分:1)

如何做到这一点:

update t1
set new_id = (SELECT new_id FROM t_changes WHERE old_id=id);

请注意,如果t1中的某些行t_changes中没有相应的行,则会将t1.new_id更改为NULL

答案 1 :(得分:1)

这是你的Postgres update声明:

update t1
    set new_id = n.new_id
    from t1 t inner join
         t_changes n
         on n.old_id = t.id;

问题在于t1中的update引用了t1中的不同from。你打算让他们成为同一个参考。你可以这样做:

update t1
    set new_id = n.new_id
    from t_changes n
    where n.old_id = t.id;

您的语法非常接近某些其他数据库(例如SQL Server)支持的语法。但是,对于他们来说,您需要在更新中使用表别名

update t
    set new_id = n.new_id
    from t1 t inner join
         t_changes n
         on n.old_id = t.id;