Итеративный столбец UPDATE с внешним столбцом - PullRequest
0 голосов
/ 24 июня 2018

У меня есть следующие две таблицы:

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 голосов
/ 24 июня 2018

Один из способов - использовать коррелированный подзапрос:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...