2013-09-21 14 views
10

私はPostgreSQL 9.1の多くの行の多くの列を更新する必要があります。私は現在、多くの異なるUPDATEクエリ、(主キーに基づいて)別の行で動作一つ一つにそれをやっている:PostgreSQLの1つのクエリで異なる主キーを持つ複数の行を更新しますか?

UPDATE mytable SET column_a = 12, column_b = 6 WHERE id = 1; 
UPDATE mytable SET column_a = 1, column_b = 45 WHERE id = 2; 
UPDATE mytable SET column_a = 56, column_b = 3 WHERE id = 3; 

私はこれらのクエリの数千をしなければなりません。

私はPostgreSQLの1つのクエリでたくさんの行を "一括更新"できますか? INSERTを使用している場合は、一度に複数の行を挿入することができます。(INSERT INTO mytable (column_a, column_b) VALUES ((12, 6), (1, 45));)、UPDATEのようなものがありますか?

のような何か:

UPDATE mytable SET (id, column_a, column_b) FROM VALUES ((1, 12, 6), (2, 1, 45), (3, 56, 3), …) 

重要な点は、それぞれの 'VALUE'は1行だけを更新することです(WHERE id =に基づく)。各行には更新が必要な同じ固定数の列がありますが、各行の列ごとに異なる値があるため、UPDATE mytable SET column_a = 12, column_b = 6 WHERE id IN (1, 2, 3);は機能しません。

答えて

7

ケースに該当する場合は、それを使用できます。

create table test(id int, a int, b int); 

insert into test(id, a, b) 
values 
(1, 1, 1), 
(2, 1, 1), 
(3, 1, 1), 
(4, 1, 1), 
(5, 1, 1), 
(6, 1, 1), 
(7, 1, 1); 


update test as d 
set a = s.a, b = s.b 
from 
(
    values 
    (1, 2, 2), 
    (2, 2, 2) 
) as s(id, a, b) 
where d.id = s.id 

SQL FIDDLE DEMO

16

はい、あなたは一度に複数の行を更新する(通常はこれをSQLで好まれます)することができます。そこにこれを行うにはいくつかの方法をしているが、私が考える最も読みやすいとエレガントは、IDのと値を持つ派生テーブルを使用することですので、読めない

update mytable as m set 
    column_a = c.column_a, 
    column_b = c.column_b 
from (values 
    (1, 12, 6), 
    (2, 1, 45), 
    (3, 56, 3) 
) as c(id, column_a, column_b) 
where c.id = m.id 

を、より多くの明白な解決策はcaseを使用することです:

update mytable set 
    column_a = case id when 1 then 12 when 2 then 1 when 3 then 56 end, 
    column_b = case id when 1 then 6 when 2 then 45 when 3 then 3 end 
where id in (1, 2, 3) 
+0

このアプローチは私のために素晴らしい!ありがとう!!複数のキー/列の結合でも機能します。つまり、 "どこでc.id = m.idとc.column_a = m.column_a"; –

関連する問題