PostgreSql:为什么此更新工作不正确?
在我需要用新值替换id的地方有一个表t1 第二个表t_变更包含替换 旧id->新id。 但是当我更新t1时,所有记录都包含相同的新id值。 什么是不正确的? 相同的更新在T-SQL中成功运行PostgreSql:为什么此更新工作不正确?,postgresql,Postgresql,在我需要用新值替换id的地方有一个表t1 第二个表t_变更包含替换 旧id->新id。 但是当我更新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
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"
不如这样做:
update t1
set new_id = (SELECT new_id FROM t_changes WHERE old_id=id);
请注意,如果对于
t1
中的某些行,在t\u changes
中没有相应的行,这将更改t1。新的\u id
为NULL
如何改为:
update t1
set new_id = (SELECT new_id FROM t_changes WHERE old_id=id);
请注意,如果
t1
中的某些行在t\u changes
中没有相应的行,这将t1.new\u id
更改为NULL这是您的Postgresupdate
语句:
update t1
set new_id = n.new_id
from t1 t inner join
t_changes n
on n.old_id = t.id;
问题在于update
中的t1
与中的t1
不同。您希望它们是相同的参考。您可以通过以下方式执行此操作:
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;
这是您的Postgresupdate
声明:
update t1
set new_id = n.new_id
from t1 t inner join
t_changes n
on n.old_id = t.id;
问题在于update
中的t1
与中的t1
不同。您希望它们是相同的参考。您可以通过以下方式执行此操作:
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;
好的,谢谢。你是对的。我正在将SQL Server业务逻辑移植到PostgreSql,这就是问题的原因。此语句在T-Sql中有效,但在PostgreSql中不起作用。我需要查看所有像这样的更新stmt。@Oleg:这是有文档记录的:“注意,目标表不能出现在from_列表中,除非您打算进行自连接”@Oleg。您的查询在SQL Server中也不会正常工作,因为t1
在FROM
子句中被赋予了t
的别名。UPDATE
使用表名而不是别名(尽管您的实际查询可能没有这个问题)。你是对的。我正在将SQL Server业务逻辑移植到PostgreSql,这就是问题的原因。此语句在T-Sql中有效,但在PostgreSql中不起作用。我需要查看所有像这样的更新stmt。@Oleg:这是有文档记录的:“注意,目标表不能出现在from_列表中,除非您打算进行自连接”@Oleg。您的查询在SQL Server中也不会正常工作,因为t1
在FROM
子句中被赋予了t
的别名。UPDATE
使用的是表名而不是别名(尽管您的实际查询可能没有这个问题)。