我有两张桌子
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
中的值。基本上,我想用bar2,bar3和bar4替换temp中第二,第三和第四个值的name列。
我使用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
答案 0 :(得分:2)
摆脱你的第一个FROM条款。
FROM必须在SET之后,而不是之前,它只能影响WHERE子句。必须使用子查询完成SET。
您完成的代码是:
UPDATE temp SET name=(SELECT t.name FROM t WHERE temp.intval = t.inval);
PostgreSQL有一些方法可以优化它,所以它不像你只是做一个巨大的嵌套循环连接(并根据连接标准从堆中反复查找一行)。
编辑:添加计划以显示我们实际上并没有对第一个表中的每一行的第二个表进行顺序扫描。
这是一个使用group-by从另一个表中更新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)
`