別のテーブルのデータで列を更新する


11

複雑な問題に取り組んでいますが、この問題を簡単に説明します。

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

回答:


19

適切な形式は次のとおりです(情報が不足しているため、現在の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およびを使用WHERE

詳細はのマニュアルUPDATEを参照してください。


0

あなたはこのようなことをしなければなりません:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.