Postgresql
使用另一個表中的數據更新列
我正在處理複雜的問題,但我會將其簡化為這個問題。
我有兩張桌子
A [ID, column1, column2, column3] B [ID, column1, column2, column3, column4]
我想更新第三個:
C [ID, column1, column2,column3]
我正在使用此查詢更新另一個第三個表。
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 ;
我有:
UPDATE 0
當我執行此查詢時:
select A.column1 as firstTab, B.column2 as secTab, (A.column1 + B.column2) thirdTab from A, B limit 1;
我得到了結果。我錯過了什麼嗎?
正確的形式是(假設目前的 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);
最後一個
WHERE
子句是可選的,以避免不會更改任何內容的空更新(但仍會以全部成本編寫新的行版本)。ypercube已經在他的評論中給出了基本解釋(現已刪除):
你不會得到重複。您的派生表是交叉連接
A
和B
(即沒有任何連接條件),然後選擇任意行(LIMIT 1
沒有ORDER BY
)。然後它使用該任意行中的值來更新 table 的所有行C
。如果您希望 C 的不同行使用不同的值,則必須加入 3 個表(使用JOIN - ON
andWHERE
)