Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSql:为什么此更新工作不正确?_Postgresql - Fatal编程技术网

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

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

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

这是您的Postgres
update
语句:

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;

这是您的Postgres
update
声明:

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
使用的是表名而不是别名(尽管您的实际查询可能没有这个问题)。