use*_*937 13 postgresql join update
我正在处理复杂的问题,但我会将其简化为这个问题。
我有两张桌子
A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]
Run Code Online (Sandbox Code Playgroud)
我想更新第三个:
C [ID, column1, column2,column3]
Run Code Online (Sandbox Code Playgroud)
我正在使用此查询更新另一个第三个表。
UPDATE C
set column1=t.firstTab, column2=t.secondTab, column3=t.thirdTab
from (select A.column1 as firstTab, B.column2 as secTab,
(A.column1 + B.column2) thirdTab
from A, B limit 1; ) as t ;
Run Code Online (Sandbox Code Playgroud)
我有:
UPDATE 0
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时:
select A.column1 as firstTab, B.column2 as secTab, (A.column1 + B.column2) thirdTab
from A, B limit 1;
Run Code Online (Sandbox Code Playgroud)
我得到了结果。我错过了什么吗?
示例数据:http : //sqlfiddle.com/#!15/e4d08/5
Erw*_*ter 24
正确的形式是(假设当前的 pg 版本 9.3 缺少信息):
UPDATE C
SET column1 = A.column1
, column2 = B.column2
, column3 = A.column1 + B.column2
FROM A
JOIN B ON A.id = B.id -- ??? not specified in question!
WHERE C.id = A.id -- ??? not specified in question!
AND (C.column1, C.column2, C.column3) IS DISTINCT FROM
(A.column1, B.column2, A.column1 + B.column2);
Run Code Online (Sandbox Code Playgroud)
最后一个WHERE子句是可选的,以避免不会改变任何内容的空更新(但仍然以全部成本编写新的行版本)。
ypercube已经在他的评论中给出了基本解释(现已删除):
你不会得到重复。您的派生表是交叉连接
A和B(即没有任何连接条件),然后选择任意行(LIMIT 1没有ORDER BY)。然后它使用来自该任意行的值来更新 table 的所有行C。如果您希望对 C 的不同行使用不同的值,则必须加入 3 个表(使用JOIN - ON和WHERE)
| 归档时间: |
|
| 查看次数: |
99898 次 |
| 最近记录: |