Video: van append naar upsert: nieuwe én gewijzigde records verwerken
Onderstaande video is een vervolg op deze eerdere video, maar kun je ook op zichzelf bekijken. Stel, je hebt in de vorige stap netjes alleen nieuwe records toegevoegd. Geen dubbele data, mooi. Maar dan komt de volgende vraag: wat als bestaande records ondertussen zijn gewijzigd?
Denk aan een productnaam die is aangepast, een prijs die is veranderd of een categorie die anders is ingedeeld. Een gewone append-query ziet die records niet als nieuw. Ze bestaan immers al in de doeltabel. En dus blijven ze ongemerkt oud.
In deze video maken we dat probleem eerst zichtbaar. Daarna bouwen we de oplossing op met SQL: bestaande records bijwerken met UPDATE … FROM en nieuwe records toevoegen met INSERT INTO … SELECT.
Als laatste bekijken we MERGE. Daarmee combineer je die UPDATE- en INSERT-logica in één centrale instructie. Van append gaan we dus naar upsert, een samenvoeging van UPDATE en INSERT: bijwerken wat gewijzigd is en toevoegen wat nog ontbreekt.
Veel kijkplezier!
Robin van Hattum
SQL consultant en trainer
Bijbehorende code
Van append naar upsert
De volgende code kun je gebruiken om het zelf te testen:
Oplossing A: Losse UPDATE en INSERT
Bestaande records bijwerken:
UPDATE d
SET d.ProductNaam = b.ProductNaam,
d.Categorie = b.Categorie,
d.Prijs = b.Prijs
FROM Doel.DimProduct AS d
JOIN Bron.Producten AS b
ON d.ProductID = b.ProductID
WHERE d.ProductNaam <> b.ProductNaam
OR d.Categorie <> b.Categorie
OR d.Prijs <> b.Prijs;
Nieuwe records toevoegen:
INSERT INTO Doel.DimProduct
( ProductID, ProductNaam, Categorie, Prijs )
SELECT b.ProductID, b.ProductNaam, b.Categorie, b.Prijs
FROM Bron.Producten AS b
WHERE NOT EXISTS
( SELECT 1 FROM Doel.DimProduct AS d
WHERE d.ProductID = b.ProductID
);
Oplossing B: MERGE
MERGE Doel.DimProduct AS d
USING Bron.Producten AS b
ON d.ProductID = b.ProductID
WHEN MATCHED
AND ( d.ProductNaam <> b.ProductNaam
OR d.Categorie <> b.Categorie
OR d.Prijs <> b.Prijs
)
THEN UPDATE
SET d.ProductNaam = b.ProductNaam,
d.Categorie = b.Categorie,
d.Prijs = b.Prijs
WHEN NOT MATCHED BY TARGET
THEN INSERT ( ProductID, ProductNaam, Categorie, Prijs )
VALUES ( b.ProductID, b.ProductNaam, b.Categorie, b.Prijs );
Agenda
Komende SQL cursussen
| Maandag 12 oktober 2026 | Level 1: Database en Datawarehouse Essentials | Utrecht |
| Di 13 & Wo 14 oktober 2026 | Level 2: Basisvaardigheden Query's schrijven met SQL | Utrecht |
| Do 15 & Vr 16 oktober 2026 | Level 3: Vervolgcursus Query's optimaliseren met SQL | Utrecht |
| Donderdag 5 november 2026 | Copilot | Utrecht |
| Maandag 23 november 2026 | Level 1: Database en Datawarehouse Essentials | Eindhoven |
| Maandag 23 november 2026 | Level 1: Database en Datawarehouse Essentials | Online |
| Di 24 & Wo 25 november 2026 | Level 2: Basisvaardigheden Query's schrijven met SQL | Eindhoven |
| Di 24 & Wo 25 november 2026 | Level 2: Basisvaardigheden Query's schrijven met SQL | Online |
| Do 3 & Vr 4 december 2026 | Level 3: Vervolgcursus Query's optimaliseren met SQL | Utrecht |
| Do 3 & Vr 4 december 2026 | Level 3: Vervolgcursus Query's optimaliseren met SQL | Online |