MERGE é uma das estruturas mais perigosas de converter manualmente: condições de corrida, duplicatas e triggers podem corromper dados. No PostgreSQL o padrão idiomático é INSERT ... ON CONFLICT DO UPDATE (upsert).
Paralelo conceitual
SQL Server — MERGE
MERGE destino AS d USING origem AS o ON d.id = o.id WHEN MATCHED THEN UPDATE SET valor = o.valor WHEN NOT MATCHED THEN INSERT (id, valor) VALUES (o.id, o.valor);
PostgreSQL — ON CONFLICT
INSERT INTO destino (id, valor) SELECT id, valor FROM origem ON CONFLICT (id) DO UPDATE SET valor = EXCLUDED.valor;
Checklist antes de produção
Confirme índice UNIQUE ou PRIMARY KEY na coluna de conflito.
Valide se WHEN NOT MATCHED vira INSERT sem duplicar em corrida.
Teste com volume real — MERGE mal convertido costuma passar em dev e falhar sob carga.