如何有条件地更新表数据?

时间:2016-10-14 10:36:16

标签: sql postgresql

我正在尝试使用表B中的两个数据值(每天备份每天的日期)来更新表A,B有数百万级别的数据 表A和B的结构是

A  -----Da   primary key  
   -----Db
B  -----Da  (table may have many Da data)
   -----Db
   -----....

现在,我的SQL是:

INSERT INTO A (Da,Db)
    SELECT DISTINCT on(Da)Da,Db
    FROM B
    ON conflict(Da) DO UPDATE SET Db = excluded.Db

但效率低下,我认为如果做出判断(如果A.Db = B.Db则不做任何事情),UPDATE之前会提高效率,因为A.Db = B.Db在大多数情况下(约百分之九十八) 。 如何编写代码对我来说是个问题(我对SQL不太熟悉) 乞求你一个伟大的上帝,令人讨厌! !

1 个答案:

答案 0 :(得分:0)

B(Da, Db)上的索引应该可以解决任何性能问题。

但是,您的查询不正确。使用DISTINCT ON时,您需要ORDER BY

INSERT INTO A (Da,Db)
    SELECT DISTINCT ON (Da) Da, Db
    FROM B
    ORDER BY Da, Db
    ON CONFLICT (Da) DO UPDATE SET Db = excluded.Db;