1

私は2つのテーブルを持っています

junk=# select * from t;                                                                                                                                
   name   | intval 
----------+--------
 bar2  |      2
 bar3  |      3
 bar4  |      4
(3 rows)

junk=# select * from temp;                                                                                                                             
 id |    name    | intval 
----+------------+--------
  1 | foo   |      0
  2 | foo2  |      2
  3 | foo3  |      3
  4 | foo4  |      4
  5 | foo5  |      5
(5 rows)

ここで、からの値を使用して、の値table tを更新しますtable temp。基本的に、tempの2番目、3番目、4番目の値の名前列をbar2、bar3、bar4に置き換えたいと思います。

COPYステートメントを使用してテーブルtを作成しました。私はバッチ更新を行っており、それを最適化しようとしています。

したがって、このエラーが発生します。これはかなり基本的なものだと思います。

junk=# UPDATE temp FROM t SET name=t.name FROM t WHERE intval=t.intval;
ERROR:  syntax error at or near "FROM"
LINE 1: UPDATE temp FROM t SET name=t.name FROM t WHERE intval=t.int...
                    ^
junk=# 

さて、これは機能します。

UPDATE test SET name=t.name FROM t WHERE test.intval=t.intval
4

1 に答える 1

2

最初のFROMt句を削除します。

FROMはSETの前ではなく、SETの後に来る必要があり、WHERE句にのみ影響します。SETはサブクエリで実行する必要があります。

完成したコードは次のとおりです。

UPDATE temp SET name=(SELECT t.name FROM t WHERE temp.intval = t.inval);

PostgreSQLにはこれを最適化するいくつかの方法があるため、巨大なネストされたループ結合を実行しているわけではありません(結合基準に基づいてヒープから1行を何度も検索します)。

編集:計画を追加して、実際には、最初のテーブルの各行について2番目のテーブルの順次スキャンを実行していないことを示します。

次の例は、別のテーブルのgroup-byを使用して1つのテーブルの172行を更新する例です。

mtech_test=# explain analyze
update ap
set amount = (select sum(amount) from acc_trans ac where ac.trans_id = ap.id) + 1;
                                                                 QUERY PLAN 

--------------------------------------------------------------------------------
---------------------------------------------------------------------
Update on ap  (cost=0.00..3857.06 rows=229 width=231) (actual time=39.074..39.0
   74 rows=0 loops=1)
 ->  Seq Scan on ap  (cost=0.00..3857.06 rows=229 width=231) (actual time=0.050..28.444 rows=172 loops=1)
     SubPlan 1
       ->  Aggregate  (cost=16.80..16.81 rows=1 width=5) (actual time=0.109..0.110 rows=1 loops=172)
             ->  Bitmap Heap Scan on acc_trans ac  (cost=4.28..16.79 rows=4 width=5) (actual time=0.075..0.102 rows=4 loops=172)
                   Recheck Cond: (trans_id = ap.id)
                   ->  Bitmap Index Scan on acc_trans_trans_id_key  (cost=0.00..4.28 rows=4 width=0) (actual time=0.006..0.006 rows=4 loops=172)
                         Index Cond: (trans_id = ap.id)
Trigger for constraint ap_entity_id_fkey: time=69.532 calls=172
Trigger ap_audit_trail: time=391.722 calls=172
Trigger ap_track_global_sequence: time=1.954 calls=172
Trigger check_department: time=111.301 calls=172
Total runtime: 612.001 ms
(13 rows)

`

于 2012-08-30T04:02:46.413 に答える