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.