sql >> Database >  >> RDS >> Sqlserver

Hoe te updaten vanuit SELECT in SQL Server

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.


  1. Voorkom automatische verhoging van InnoDB OP DUPLICATE KEY

  2. Groepeer DateTime in intervallen van 5,15,30 en 60 minuten

  3. Top vijf overwegingen voor het ontwerpen van database-indexen in SQL Server

  4. Keuze opslagmotor:Aria