SQL更新クエリの集計関数ですか?


98

あるテーブルの値を別のテーブルの値の合計に設定しようとしています。これらの線に沿った何か:

UPDATE table1
SET field1 = SUM(table2.field2)
FROM table1
INNER JOIN table2 ON table1.field3 = table2.field3
GROUP BY table1.field3

もちろん、このスタンドとして、それは動作しません- SETサポートしていませんSUMし、それがサポートしていませんGROUP BY

私はこれを知っているべきですが、私の心は空白を描いています。何が悪いのですか?


すばらしい質問です。複数回投票できるといいのですが。
Joe

回答:


148
UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (select field3, sum(field2) as field2Sum
   from table2
  group by field3) as t2
on t2.field3 = t1.field3  

40
3つのクエリを並べて実行プランを実行しました。この回答のコストは5%でした。
マーガレット

エレガントで簡単に実装できます...あなたは一日中どこにいましたか??? 私は今、1時間以上頭を叩いています:)
Ange1

1
重要:グループ化しているフィールドのいずれかがnull可能である可能性がある場合は注意してください(たとえば、上記のfield3)。あなたはこのために、アカウントに「参加」や、あなたの合計が不正確になります(変更する必要があると思いますstackoverflow.com/a/14366034/16940を
Simon_Weaver

10

使用する:

UPDATE table1
   SET field1 = (SELECT SUM(t2.field2) 
                   FROM TABLE2 t2 
                  WHERE t2.field3 = field2)

14
3つのクエリを並べて実行プランを実行しました。この回答のコストは44%でした。
マーガレット

t2.filed3はtable1.field2と同じ名前だったので、これは私にとっては機能しませんでした。そのため、舞台裏で実行された結合は適切に機能しませんでした。(私は舞台裏で結合があると思います)
Joe

5

または、JBrooksOMG Poniesの回答を組み合わせて使用​​することもできます。

UPDATE table1
   SET field1 = (SELECT SUM(field2)
                   FROM table2 AS t2
                  WHERE t2.field3 = t1.field3)
  FROM table1 AS t1

16
3つのクエリを並べて実行プランを実行しました。この回答のコストは51%でした。
マーガレット

おきドキ!そしてフィードバックをありがとう。ツールボックスに追加します。:-)
Paulo Santos、

これは、オプティマイザを使用しても、有効なすべての行をSUM()で起動する必要があるSUBQUERYを使用しているためです
clifton_h

4

CROSS APPLYを使用するのに適した状況

UPDATE t1
   SET t1.field1 = t2.field2Sum
  FROM table1 t1
 CROSS APPLY (SELECT SUM(field2) as field2Sum
                FROM table2 t2
               WHERE t2.field3 = t1.field3) AS t2

3

質問にSQL Serverのタグが付いていることは知っていますが、PostgreSQLを使用している場合は、JOINを指定したUPDATEに注意してください。@JBrooksの回答は機能しません:

UPDATE t1
SET t1.field1 = t2.field2Sum
FROM table1 t1
INNER JOIN (...) as t2
on t2.field3 = t1.field3  

あなたはそれにそれを適応させる必要があります:

UPDATE table1 t1
SET t1.field1 = t2.field2Sum
FROM (...) as t2
WHERE t2.field3 = t1.field3  

PostgreSQLで自己結合と見なされるfrom_list理由を取得するには、ドキュメントのパラメーターを参照してくださいFROMhttps : //www.postgresql.org/docs/9.5/static/sql-update.html#AEN89239


0

以下のようにCTEを使用することもできます。

;WITH t2 AS (
    SELECT field3, SUM(field2) AS field2
    FROM table2
    GROUP BY field3
)
UPDATE table1
SET table1.field1 = t2.field2
FROM table1
INNER JOIN t2 ON table1.field3 = t2.field3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.