Postgres UPDATE x WHERE id in y

Kaj*_*Abt 3 sql postgresql union postgresql-performance

之前可能已经提出过这个问题,但谷歌搜索"IN"这样的关键字效果不佳.

这是我的查询:

UPDATE tblCustomer SET type = 2 
WHERE idcustomer                                
IN (SELECT fidcustomer1
    FROM tblorder                   
     UNION                      
    SELECT fidcustomer2
    FROM tblorder                   
   )                                
Run Code Online (Sandbox Code Playgroud)

要打破它:我想将所有客户的类型(只是一个int)设置为2,对于出现在order-table中的所有客户,在任一列中.

在我的测试数据中,这些表中没有一行包含超过几百行,但查询运行了很多分钟(即使没有UNION,这似乎没有太大区别),显然重新执行内部查询客户每行一次.我显然可以将它重写为单个SELECT DISTINCT(id),然后进行几百个单行更新,并以我用于ODBC访问的任何语言执行逻辑,但这只是一个黑客攻击.

我怎样才能正确地重写这个?

附录:我要更新的表包含很多相对较大的BYTEA blob,每行几MB.它们被设置为Storage External或Extended,但我想知道这是否会使顺序扫描变慢.所有更新似乎都需要很长时间,而不仅仅是这一次.

Erw*_*ter 5

我建议一个更简单的方法:

UPDATE tblCustomer c
SET    type = 2 
FROM   tblorder o
WHERE  c.idcustomer IN (o.fidcustomer1, o.fidcustomer2)
AND    c.type IS DISTINCT FROM 2  -- optional, to avoid empty updates
Run Code Online (Sandbox Code Playgroud)

除此之外,如果有重复tblorder,那么类似的方法来你有什么是明智的:

UPDATE tblCustomer c
SET    type = 2 
FROM  (
    SELECT fidcustomer1 AS cust FROM tblorder
    UNION
    SELECT fidcustomer2 FROM tblorder
    ) o
WHERE  c.idcustomer = o.cust
AND    c.type IS DISTINCT FROM 2;
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,在PostgreSQL中,加入表定期执行比IN表达更好.