[英]postgresql 9.6:issue with UPDATE
我坚持使用UPDATE,可能是我搞砸了:
除非要添加AND条件,否则“ proj_los
”表中预期要更新的行数为32,但是只有8个被更新。
select count(*) from import.tmp_kk where root_id = '57b2e67b-5862-499a-a471-0f2f6b23440e';
> 32
1)正确的结果->使用最后的AND子句( root_id = '57b2e67b-5862-499a-a471-0f2f6b23440e'
)
sql> update
proj_los as oko
set lo_root_id = import.tmp_kk.root_id
from import.tmp_kk
where oko.lo_id = import.tmp_kk.lo_id
and import.tmp_kk.root_id = '57b2e67b-5862-499a-a471-0f2f6b23440e'
[2018-10-05 18:13:59] 32 rows affected in 50 ms
select count(*) from proj_los where lo_root_id = '57b2e67b-5862-499a-a471-0f2f6b23440e';
> 32
2)错误的结果
sql> update
proj_los as oko
set lo_root_id = import.tmp_kk.root_id
from import.tmp_kk
where oko.lo_id = import.tmp_kk.lo_id;
[2018-10-05 18:17:31] 174202 rows affected in 17 s 427 ms
select count(*) from proj_los where lo_root_id = '57b2e67b-5862-499a-a471-0f2f6b23440e';
> 8
有什么帮助吗?
您遇到了UPDATE ... FROM ...
的postgres 文档中描述的问题:
使用FROM时,应确保该联接为要修改的每一行最多产生一个输出行。 换句话说,目标行不应与其他表的多个行连接。 如果是这样,那么将仅使用联接行之一来更新目标行,但是将很难预测将使用哪一行。
如果未指定root_id
的附加过滤器,则更新所基于的查询很可能为每个更新的行返回多个行。 一些不可预测的行用于执行更新。 而且必须发生的是,在许多情况下,使用了错误的root_id
。
请注意如何更新修改的174202
行(而不是您编写的8行)。 它更新了root_id
更新的不相关记录中的root_id
。
因此,请检查import.tmp_kk
表。 对于给定的lo_id
它包含多于一条的记录(具有不同的root_id
)。
我不明白:我说正确的结果将是该root_id的更新或32行而不是8行。
当然import.tmp_kk
包含比更lo_id
单个root_id
,对目标表proj_los
, lo_root_id
将是一个FK的lo_id
。
对于postgres文档所关心的问题,在我看来,它基本上是在确保结果联接表中没有重复对象:
“使用FROM时,应确保该联接为要修改的每一行最多产生一个输出行。”
所以我检查了:
with tmp_joinres as (
select oko.lo_id, gg.root_id
from proj_los oko
full outer join import.tmp_kk gg on oko.lo_id = gg.lo_id
)
select tmp_joinres.lo_id, tmp_joinres.root_id, count(*)
from tmp_joinres
group by tmp_joinres.lo_id, tmp_joinres.root_id
having count(*) > 1;
但没有结果:
[2018-10-05 21:58:20] 0 rows retrieved in 5 s 737 ms (execution: 5 s 729 ms, fetching: 8 ms)
您或其他人可以告诉我如何修改UPDATE语句以获得正确的结果吗?
谢谢
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.