Under de fleste omstændigheder udføres SQL-opdateringer ved hjælp af direkte referencer til en bestemt tabel (OPDATERE bøger SET books.title ='Hobbitten' WHERE books.id =1
). Alligevel kan det nogle gange vise sig at være fordelagtigt at ændre indholdet af en tabel indirekte , ved at bruge et undersæt af data hentet fra sekundær forespørgselssætning.
Udfører en OPDATERING
ved hjælp af en sekundær SELECT
sætning kan udføres på en af to måder, primært afhængigt af hvilken version af SQL Server du bruger. Vi vil kort undersøge begge muligheder, så du kan finde det, der fungerer bedst for dig.
Brug af INNER JOINS
For alle SQL Server-installationer er den mest grundlæggende metode til at udføre denne handling at bruge en INNER JOIN
, hvorved værdier i kolonnerne i to forskellige tabeller sammenlignes med hinanden.
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 ovenstående eksempel er vi OPDATERING
books.primary_author
feltet for at matche authors.name
for 'Hobbitten' af JOINING
begge tabeller i forespørgslen til deres respektive matchende værdier for authors.id
og books.author_id
.
Brug af MERGE til at OPDATERE og INDSÆT samtidigt
Til SQL Server 2008 og nyere introducerede Microsoft den usædvanligt nyttige MERGE
operation, der ligner ovenstående INNER JOIN
metode, men FLET
forsøger at udføre både en OPDATERING
og en INSERT
kommando sammen. Dette synkroniserer effektivt de to tabeller baseret på den udførte forespørgsel, opdaterer og indsætter poster efter behov for at de to kan matche.
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 fulde forespørgsel ved brug af MERGE
er bestemt en smule mere kompleks end en grundlæggende INNER JOIN
, men når du først forstår, hvordan betjeningen fungerer, vil du hurtigt forstå, hvor kraftfuld denne funktion virkelig kan være.
De første par linjer er ret selvforklarende:
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
Vi ønsker at FLEDE TIL
(OPDATERING
/INDSÆT )
bøgerne
tabel ved at bruge de sekundære forfattere
tabel, og vi matcher de to baseret på den samme books.author_id =authors.id
sammenligning.
Hvor FLET
kommandoen adskiller sig er i forgreningslogikken, der følger.
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
Her beder vi SQL om kun at udføre en handling, når poster MATCHED
– når en eksisterende post er fundet. I så fald udfører vi en standard OPDATERING
ligesom vi gjorde før, indstille books.primary_author
feltet er lig med authors.name
felt.
Endelig, hvis forespørgslen opdager en matchende sammenlignende post, der ikke eksisterer, udfører vi i stedet en INSERT
.
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
Her beder vi simpelthen SQL om at INSERT
en ny post i bøgerne
tabel og videresende værdierne for author_id
og primær_forfatter
felter, hentet fra de tilknyttede forfattere
tabelpost.
Slutresultatet af vores MERGE
erklæring er, at for hver forfatter i forfattere
tabel, verificerer vi, om der findes en tilsvarende bog i bøger
. Hvis en post er fundet, sikrer vi books.primary_author
indstilles ved hjælp af OPDATERING
, og hvor der ikke findes noget match, tilføjer vi en ny post til bøger
.
Med det bør du have en solid forståelse af to forskellige metoder, der kan bruges til at OPDATERE
poster i SQL ved at bruge sekundær, sammenlignende SELECT
udsagn.