Academies

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

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 2026Level 1: Database en Datawarehouse EssentialsUtrecht
Di 13 & Wo 14 oktober 2026Level 2: Basisvaardigheden Query's schrijven met SQLUtrecht
Do 15 & Vr 16 oktober 2026Level 3: Vervolgcursus Query's optimaliseren met SQLUtrecht
Donderdag 5 november 2026CopilotUtrecht
Maandag 23 november 2026Level 1: Database en Datawarehouse EssentialsEindhoven
Maandag 23 november 2026Level 1: Database en Datawarehouse EssentialsOnline
Di 24 & Wo 25 november 2026Level 2: Basisvaardigheden Query's schrijven met SQLEindhoven
Di 24 & Wo 25 november 2026Level 2: Basisvaardigheden Query's schrijven met SQLOnline
Do 3 & Vr 4 december 2026Level 3: Vervolgcursus Query's optimaliseren met SQLUtrecht
Do 3 & Vr 4 december 2026Level 3: Vervolgcursus Query's optimaliseren met SQLOnline