複雑な問題に取り組んでいますが、この問題を簡単に説明します。
2つのテーブルがあります
A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]
そして、私は3番目を更新したいです:
C [ID, column1, column2,column3]
このクエリを使用して別の3番目のテーブルを更新しています。
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 は彼のコメントで基本的な説明をすでに行っています:
重複はありません。派生テーブルは、
A
とB
をクロス結合して(つまり結合条件なし)、任意の行を選択します(LIMIT 1
なし、ORDER BY
)。次に、その任意の行の値を使用して、テーブルC
のすべての行を更新します。 Cの行ごとに異なる値を使用する場合は、3つのテーブルを結合する必要があります(JOIN - ON
とWHERE
を使用)
あなたはこのようなことをしなければなりません:
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
join B on ...
where ... ) as t