我有以下两个表:
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。
答案 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