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.