Postgresql

使用另一個表中的數據更新列

  • June 6, 2021

我正在處理複雜的問題,但我會將其簡化為這個問題。

我有兩張桌子

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; 

我得到了結果。我錯過了什麼嗎?

樣本數據:http ://sqlfiddle.com/#!15/e4d08/5

正確的形式是(假設目前的 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已經在他的評論中給出了基本解釋(現已刪除):

你不會得到重複。您的派生表是交叉連接AB(即沒有任何連接條件),然後選擇任意行(LIMIT 1沒有ORDER BY)。然後它使用該任意行中的值來更新 table 的所有行C。如果您希望 C 的不同行使用不同的值,則必須加入 3 個表(使用JOIN - ONand WHERE

有關詳細資訊,請參閱手冊UPDATE

引用自:https://dba.stackexchange.com/questions/58371