sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan OPDATERES fra SELECT i SQL Server

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.


  1. Tilsløring af følsomme data i dine eksekveringsplaner

  2. Sådan fungerer UTC_DATE() i MariaDB

  3. SQL:Gentag en resultatrække flere gange, og nummerér rækkerne

  4. Rank funktion i MySQL