In den meisten Fällen werden SQL-Updates unter Verwendung von direkten Verweisen durchgeführt zu einer bestimmten Tabelle (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1
). Gelegentlich kann es sich jedoch als vorteilhaft erweisen, den Inhalt einer Tabelle indirekt zu ändern , indem eine Teilmenge von Daten verwendet wird, die aus der sekundären Abfrageanweisung stammen.
Durchführen eines UPDATE
mit einem sekundären SELECT
-Anweisung kann auf zwei Arten ausgeführt werden, hauptsächlich abhängig davon, welche Version von SQL Server Sie verwenden. Wir werden beide Optionen kurz untersuchen, damit Sie herausfinden können, was für Sie am besten funktioniert.
INNER JOINS verwenden
Für alle SQL Server-Installationen ist die einfachste Methode zum Ausführen dieser Aktion die Verwendung eines INNER JOIN
, wobei Werte in den Spalten zweier verschiedener Tabellen miteinander verglichen werden.
UPDATE
books
SET
books.primary_author = authors.name
FROM
books
INNER JOIN
authors
ON
books.author_id = authors.id
WHERE
books.title = 'The Hobbit'
Im obigen Beispiel UPDATING
wir der books.primary_author
Feld so, dass es mit authors.name
übereinstimmt für „Der Hobbit“ von JOINING
beide Tabellen in der Abfrage auf ihre jeweiligen übereinstimmenden Werte von authors.id
und books.author_id
.
Verwendung von MERGE zum gleichzeitigen UPDATE und INSERT
Für SQL Server 2008 und neuer hat Microsoft das außerordentlich nützliche MERGE
eingeführt Vorgang, der dem obigen INNER JOIN
ähnlich ist Methode, aber MERGE
versucht, sowohl ein UPDATE
durchzuführen und ein INSERT
Befehl zusammen. Dadurch werden die beiden Tabellen basierend auf der durchgeführten Abfrage effektiv synchronisiert und Datensätze nach Bedarf aktualisiert und eingefügt, damit die beiden übereinstimmen.
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)
Die vollständige Abfrage bei Verwendung von MERGE
ist sicherlich etwas komplexer als ein einfacher INNER JOIN
, aber sobald Sie verstehen, wie die Operation funktioniert, werden Sie schnell verstehen, wie leistungsfähig diese Funktion wirklich sein kann.
Die ersten paar Zeilen sind ziemlich selbsterklärend:
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
Wir wollen MERGE INTO
(UPDATING
/INSERT
) die books
Tabelle, indem Sie die sekundären authors
verwenden Tabelle, und wir gleichen die beiden basierend auf derselben books.author_id = authors.id
ab Vergleich.
Wo der MERGE
Der Befehl unterscheidet sich in der folgenden Verzweigungslogik.
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
Hier fordern wir SQL auf, nur dann eine Aktion auszuführen, wenn Datensätze MATCHED
sind – wenn ein vorhandener Datensatz gefunden wird. In diesem Fall führen wir ein standardmäßiges UPDATE
durch genauso wie wir es zuvor getan haben, indem wir books.primary_author
setzen gleich dem authors.name
Feld.
Schließlich, wenn die Abfrage einen übereinstimmenden Vergleichsdatensatz entdeckt, der nicht vorhanden ist existieren, führen wir stattdessen ein INSERT
durch .
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Hier bitten wir SQL einfach um INSERT
einen neuen Eintrag in die books
Tabelle und Übergabe der Werte für die author_id
und primary_author
Felder, die den zugehörigen authors
entnommen wurden Tabellendatensatz.
Das Endergebnis unseres MERGE
Aussage ist die für jeden author in den authors
Tabelle prüfen wir, ob ein entsprechendes Buch in books
existiert . Wenn ein Datensatz gefunden wird, stellen wir sicher, dass books.primary_author
wird mit UPDATE
gesetzt , und wenn keine Übereinstimmung gefunden wird, fügen wir books
einen neuen Datensatz hinzu .
Damit sollten Sie ein solides Verständnis von zwei verschiedenen Methoden haben, die zum UPDATE
verwendet werden können Datensätze in SQL mithilfe von sekundärem, vergleichendem SELECT
Aussagen.