带有外部列的迭代UPDATE列

时间:2018-06-24 17:40:25

标签: postgresql

我有以下两个表:

CREATE TABLE results (
  id UUID PRIMARY KEY,
  map_id UUID,
  -- other irrelevant columns
);

CREATE TABLE mapping (
  client_id UUID PRIMARY KEY,
  server_id UUID UNIQUE
)

作为ETL清除步骤的一部分,任务是遍历mapping中的所有条目并通过将所有results匹配项与client_id交换来更新server_id。此后,map_id中的results可能不是client_id

当前,我的幼稚方法是使用调用语言(C#)遍历mapping中的所有记录并执行

UPDATE results
SET map_id = @server_id
WHERE map_id = @client_id

但是,这可能可以优化。阅读相关问题后,强烈建议不要在SQL中使用循环。那么如何将上面的迭代方法表示为SQL语句?我正在使用Postgres 10。

1 个答案:

答案 0 :(得分:1)

一种方法是使用相关子查询:

UPDATE results
SET map_id = (SELECT server_id 
              FROM mapping m 
              WHERE m.client_id = results.map_id)
WHERE map_id IN (SELECT client_id FROM mapping);

另一种方法:

UPDATE results AS r
SET map_id = m.server_id
FROM mapping m
WHERE m.client_id = r.map_id