在我需要用新值替换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"
答案 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;