sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man uppdaterar från SELECT i SQL Server

Under de flesta omständigheter utförs SQL-uppdateringar med direkta referenser till en viss tabell (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1 ). Ändå kan det ibland visa sig vara fördelaktigt att ändra innehållet i en tabell indirekt , genom att använda en delmängd av data som erhållits från sekundär frågesats.

Utför en UPDATE med en sekundär SELECT uttalande kan åstadkommas på ett av två sätt, främst beroende på vilken version av SQL Server du använder. Vi ska kort utforska båda alternativen så att du kan hitta det som fungerar bäst för dig.

Använda INNER JOINS

För alla SQL Server-installationer är den mest grundläggande metoden för att utföra denna åtgärd att använda en INNER JOIN , där värden i kolumnerna i två olika tabeller jämförs med varandra.

UPDATE
  books
SET
  books.primary_author = authors.name
FROM
  books
INNER JOIN
  authors
ON
  books.author_id = authors.id
WHERE
  books.title = 'The Hobbit'

I exemplet ovan UPDATE books.primary_author för att matcha authors.name för "The Hobbit" av JOINING båda tabellerna i frågan till sina respektive matchande värden för authors.id och books.author_id .

Använd MERGE för att UPPDATERA och INFO samtidigt

För SQL Server 2008 och senare introducerade Microsoft den exceptionellt användbara MERGE operation som liknar ovanstående INNER JOIN metod, men MERGE försöker utföra både en UPDATE och en INSERT kommando tillsammans. Detta synkroniserar effektivt de två tabellerna baserat på den utförda frågan, uppdaterar och infogar poster efter behov för att de två ska matcha.

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)

Den fullständiga frågan när du använder MERGE är förvisso lite mer komplex än en grundläggande INNER JOIN , men när du väl förstår hur operationen fungerar kommer du snabbt att förstå hur kraftfull denna funktion verkligen kan vara.

De första raderna är ganska självförklarande:

MERGE INTO
  books
USING
  authors
ON
  books.author_id = authors.id

Vi vill MERGE INTO (UPDATE /INSERT ) books tabell genom att använda de sekundära authors tabell, och vi matchar de två baserat på samma books.author_id = authors.id jämförelse.

Där MERGE kommandot skiljer sig är i förgreningslogiken som följer.

WHEN MATCHED THEN
  UPDATE SET
    books.primary_author = authors.name

Här ber vi SQL att endast utföra en åtgärd när poster MATCHED – när en befintlig post hittas. I så fall utför vi en standard UPDATE precis som vi gjorde tidigare, ställa in books.primary_author fältet är lika med authors.name fältet.

Slutligen, om frågan upptäcker en matchande jämförande post som inte existerar, utför vi istället en INSERT .

WHEN NOT MATCHED THEN
  INSERT
    (books.author_id, books.primary_author)
  VALUES
    (authors.id, authors.name)

Här ber vi helt enkelt SQL att INSERT en ny post i books tabellen och vidarebefordra värdena för author_id och primary_author fält, hämtade från de associerade authors tabellpost.

Slutresultatet av vår MERGE uttalandet är det för alla författare i authors tabell, verifierar vi om en motsvarande bok finns i books . Om en post hittas säkerställer vi books.primary_author ställs in med UPDATE , och där ingen matchning hittas lägger vi till en ny post i books .

Med det bör du ha en gedigen förståelse för två olika metoder som kan användas för att UPDATE poster i SQL genom att använda sekundär, jämförande SELECT uttalanden.


  1. Visa data från databasen med basadapter och listview

  2. Returnera primärnycklar från en länkad server i SQL Server (T-SQL-exempel)

  3. Oracle lagrad procedur:returnera både resultatuppsättning och utparametrar

  4. Oracle - Varför ska jag använda paket istället för fristående procedurer eller funktioner