SQL Server MERGE
Samenvatting: in deze tutorial leert u hoe u de SQL Server MERGE
instructie om gegevens in een tabel bij te werken op basis van waarden die overeenkomen met een andere tabel.
Introductie SQL Server MERGE-instructie
Stel dat u twee tabellen hebt met de naam bron- en doeltabellen, en u moet werk de doeltabel bij op basis van de waarden die overeenkomen met de brontabel. Er zijn drie gevallen:
- De brontabel heeft een aantal rijen die niet voorkomen in de doeltabel. In dit geval moet u rijen die in de brontabel staan, invoegen in de doeltabel.
- De doeltabel heeft enkele rijen die niet in de brontabel voorkomen. In dit geval moet u rijen uit de doeltabel verwijderen.
- De brontabel heeft enkele rijen met dezelfde toetsen als de rijen in de doeltabel. Deze rijen hebben echter verschillende waarden in de niet-sleutelkolommen. In dit geval moet u de rijen in de doeltabel bijwerken met de waarden die uit de brontabel komen.
De volgende afbeelding illustreert de bron- en doeltabellen met de bijbehorende acties: invoegen, bijwerken en verwijderen:
Als u gebruik de INSERT
, UPDATE
, en DELETE
-instructie afzonderlijk, je moet drie afzonderlijke instructies om de gegevens naar de doeltabel bij te werken met de overeenkomende rijen uit de brontabel.
SQL Server biedt echter de MERGE
-instructie waarmee u drie acties tegelijkertijd. Het volgende toont de syntaxis van de MERGE
-instructie:
Code language: SQL (Structured Query Language) (sql)
Geef eerst de doeltabel en de bron op tabel in de MERGE
-clausule.
Ten tweede bepaalt de merge_condition
hoe de rijen uit de brontabel worden vergeleken met de rijen van de doeltabel. Het is vergelijkbaar met de join-voorwaarde in de join-clausule. Normaal gesproken gebruikt u de sleutelkolommen ofwel de primaire sleutel ofwel de unieke sleutel om te matchen.
Ten derde resulteert de merge_condition
in drie statussen: MATCHED
, NOT MATCHED
, en NOT MATCHED BY SOURCE
.
-
MATCHED
: dit zijn de rijen die overeenkomen met de samenvoegvoorwaarde. In het diagram zijn ze blauw weergegeven. Voor de overeenkomende rijen moet u de rijen kolommen in de doeltabel bijwerken met waarden uit de brontabel. -
NOT MATCHED
: dit zijn de rijen van de bron tabel die geen overeenkomende rijen in de doeltabel bevat. In het diagram worden ze oranje weergegeven. In dit geval moet u de rijen uit de brontabel toevoegen aan de doeltabel. Merk op datNOT MATCHED
ook bekend staat alsNOT MATCHED BY TARGET
. -
NOT MATCHED BY SOURCE
: dit zijn de rijen in de doeltabel die niet overeenkomen met de rijen in de brontabel. Ze worden in het diagram groen weergegeven. Als u de doeltabel wilt synchroniseren met de gegevens uit de brontabel, moet u deze overeenkomstvoorwaarde gebruiken om rijen uit de doeltabel te verwijderen.
SQL Server MERGE-instructie voorbeeld
Stel dat we twee tabellen hebben sales.category
en sales.category_staging
die de verkopen per productcategorie opslaan.
Om gegevens bij te werken naar de sales.category
(doeltabel) met de waarden van de sales.category_staging
(brontabel), gebruik je de volgende MERGE
instructie:
In dit voorbeeld hebben we de waarden in de category_id
-kolommen in beide tabellen gebruikt als de samenvoegvoorwaarde.
- Ten eerste, de rijen met id 1, 3, 4 uit de
sales.category_staging
-tabel komt overeen met de rijen uit de doeltabel, daarom werkt de instructieMERGE
de waarden bij in categorienaam en bedrag kolommen in desales.category
tabel. - Ten tweede bestaan de rijen met id 5 en 6 uit de
sales.category_staging
tabel niet in desales.category
tabel, dus deMERGE
instructie voegt deze rijen in de doeltabel in. - Ten derde, de rij met id 2 van de
sales.category
-tabel bestaat niet in desales.sales_staging
-tabel, daarom is deMERGE
-instructie verwijdert deze rij.
Als resultaat van de fusie worden de gegevens in de tabel sales.category
volledig gesynchroniseerd met de gegevens in de sales.category_staging
tabel.
In deze tutorial heeft u geleerd hoe u de SQL Server MERGE
-instructie gebruikt om wijzigingen aan te brengen in een tabel gebaseerd op overeenkomende waarden uit een andere tabel.