SQL Dojo Bêta
Technique

Appliquer un flux de changements

Réduire un lot de changements au dernier par clé, suppressions comprises, puis l'appliquer avec un seul MERGE.

D'abord QUALIFY ROW_NUMBER() OVER (PARTITION BY clé ORDER BY seq DESC) = 1 : un MERGE avec deux lignes source pour une clé échoue ou en garde une au hasard. Puis WHEN MATCHED AND op = 'D' THEN DELETE, WHEN MATCHED THEN UPDATE, WHEN NOT MATCHED AND op <> 'D' THEN INSERT. N'écartez jamais les suppressions d'abord. Avec une extraction complète au lieu d'un flux, une clé absente est une suppression : fermez sa version courante.

WITH changes(seq, op, customer_id, city) AS (VALUES
  (1, 'I', 7, 'Bern'), (2, 'U', 7, 'Zurich'),
  (3, 'I', 8, 'Paris'), (4, 'D', 8, NULL),
  (5, 'U', 2, 'Lille'))
SELECT customer_id, op, city
FROM changes
QUALIFY ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY seq DESC) = 1
ORDER BY customer_id;
customer_idopcity
2ULille
7UZurich
8DNULL
L’essayer en Randori