MERGE
UPSERT, MERGE INTO
MERGE este o instrucțiune SQL care combină operațiunile de INSERT și UPDATE (și opțional DELETE) într-un singur statement. Dacă înregistrarea există o actualizează, dacă nu există o inserează. Este numită informal “upsert”.
Sintaxă Oracle #
MERGE INTO tabel_destinatie d
USING tabel_sursa s ON (d.cheie = s.cheie)
WHEN MATCHED THEN UPDATE SET
d.camp = s.camp
WHEN NOT MATCHED THEN INSERT (cheie, camp)
VALUES (s.cheie, s.camp);
Utilizare în data warehouse #
În contextul ETL, MERGE este mecanismul de bază pentru încărcarea tabelelor dimensionale:
- SCD Tip 1: un singur MERGE care actualizează înregistrările existente și le inserează pe cele noi
- SCD Tip 2: MERGE-ul este folosit în prima fază pentru a închide înregistrările modificate (setând data de sfârșit de valabilitate), urmat de un INSERT pentru noile versiuni
Disponibilitate #
- Oracle: suport complet din versiunea 9i
- PostgreSQL: nu are MERGE nativ până la versiunea 15. Alternativa este
INSERT ... ON CONFLICT(upsert) - MySQL: folosește
INSERT ... ON DUPLICATE KEY UPDATEca alternativă - SQL Server: suport complet cu sintaxă similară cu Oracle