Как исправить перенастройку оператора MERGE с помощью «NOT MATCHED BY TARGET» из MS SQL в PostgreSQL? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть такое заявление SQL:

MERGE pvl.testTable AS T
USING temp.testTable AS S
ON (T.Id = S.ID)
WHEN NOT MATCHED BY TARGET THEN
  INSERT (first,
          second,
          third,
          fourth) VALUES (s.first,
                          s.second,
                          s.third,
                          s.fourth)
WHEN MATCHED
THEN
  UPDATE
  SET
    T.first  = S.first,
    T.second = S.second,
    T.third  = S.third,
    T.fourth = S.fourth
WHEN NOT MATCHED BY SOURCE
THEN
  DELETE;

Кроме того, я знаю, что должен использовать ON CONFLICT, но как я могу справиться с тем, КОГДА НЕ СОГЛАСОВАНО ПО ЦЕЛЯМ И КОГДА НЕ СОГЛАСОВАНО ПО ИСТОЧНИКУ?

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете сделать это в два этапа: 1. Upsert и 2. Delete

-- Perform upsert and return all inserted/updated ids
WITH upsert(id) AS
(
INSERT INTO target_table (first, second, third, fourth)
SELECT first, second, third, fourth FROM source_table
ON CONFLICT (id) UPDATE SET
  first = excluded.first,
  second = excluded.second,
  third = excluded.third,
  fourth = excluded.fourth
RETURNING id
)

-- Delete any records in target that aren't in source
DELETE FROM target_table
WHERE id NOT IN (SELECT id FROM upsert);
...