In de meeste gevallen worden SQL-updates uitgevoerd met behulp van directe verwijzingen naar een bepaalde tabel (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1
). Toch kan het soms nuttig zijn om de inhoud van een tabel indirect te wijzigen , door een subset van gegevens te gebruiken die zijn verkregen uit een secundaire query-instructie.
Een UPDATE
uitvoeren met behulp van een secundaire SELECT
statement kan op twee manieren worden uitgevoerd, voornamelijk afhankelijk van de versie van SQL Server die u gebruikt. We zullen beide opties kort onderzoeken, zodat u kunt vinden wat het beste voor u werkt.
INNER JOINS gebruiken
Voor alle SQL Server-installaties is de meest elementaire methode om deze actie uit te voeren het gebruik van een INNER JOIN
, waarbij waarden in de kolommen van twee verschillende tabellen met elkaar worden vergeleken.
UPDATE
books
SET
books.primary_author = authors.name
FROM
books
INNER JOIN
authors
ON
books.author_id = authors.id
WHERE
books.title = 'The Hobbit'
In het bovenstaande voorbeeld zijn we UPDATING
de books.primary_author
veld dat overeenkomt met de authors.name
voor ‘The Hobbit’ door JOINING
beide tabellen in de zoekopdracht naar hun respectievelijke, overeenkomende waarden van authors.id
en books.author_id
.
MERGE gebruiken om gelijktijdig te UPDATEN en INSERT
Voor SQL Server 2008 en nieuwer introduceerde Microsoft de buitengewoon handige MERGE
bewerking die vergelijkbaar is met de bovenstaande INNER JOIN
methode, maar MERGE
probeert zowel een UPDATE
en een INSERT
samen opdracht geven. Hierdoor worden de twee tabellen effectief gesynchroniseerd op basis van de uitgevoerde query, waarbij records worden bijgewerkt en ingevoegd als dat nodig is om de twee overeen te laten komen.
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
De volledige zoekopdracht bij gebruik van MERGE
is zeker een beetje ingewikkelder dan die van een basis INNER JOIN
, maar als u eenmaal begrijpt hoe de bediening werkt, zult u snel begrijpen hoe krachtig deze mogelijkheid werkelijk kan zijn.
De eerste paar regels spreken voor zich:
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
We willen MERGE INTO
(UPDATE
/INSERT
) de books
tabel met behulp van de secundaire authors
tabel, en we matchen de twee op basis van dezelfde books.author_id = authors.id
vergelijking.
Waar de MERGE
commando verschilt zit in de vertakkingslogica die volgt.
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
Hier vragen we SQL om alleen een actie uit te voeren wanneer records MATCHED
– wanneer een bestaand record wordt gevonden. In dat geval voeren we een standaard UPDATE
uit net zoals we eerder deden, het instellen van de books.primary_author
veld gelijk aan authors.name
veld.
Ten slotte, als de zoekopdracht een overeenkomend vergelijkend record vindt dat niet bestaan, voeren we in plaats daarvan een INSERT
. uit .
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Hier vragen we SQL gewoon om INSERT
een nieuw record in de books
tabel en het doorgeven van de waarden voor de author_id
en primary_author
velden, overgenomen van de bijbehorende authors
tabelrecord.
Het eindresultaat van onze MERGE
verklaring is dat voor elke auteur in de authors
tabel, verifiëren we of een bijbehorend boek bestaat in books
. Als een record wordt gevonden, zorgen we ervoor dat books.primary_author
wordt ingesteld met UPDATE
, en waar geen overeenkomst wordt gevonden, voegen we een nieuw record toe aan books
.
Daarmee zou je een goed begrip moeten hebben van twee verschillende methoden die kunnen worden gebruikt om te UPDATE
records in SQL met behulp van secundaire, vergelijkende SELECT
verklaringen.