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

Sådan bruger du UPDATE fra SELECT i SQL Server

I denne artikel vil vi dække de forskellige metoder til brug af UPDATE fra SELECT-sætningen i SQL Server.

I databaseverdenen lagres statiske data typisk ikke. I stedet bliver det ved med at ændre sig, når vi opdaterer eksisterende data, arkiverer eller sletter irrelevante data og mere. Lad os f.eks. sige, at du har en tabel, der gemmer produktprisdata for din indkøbsportal. Produktpriserne ændrer sig konstant, da du kan tilbyde produktrabatter på forskellige tidspunkter til dine kunder. I dette tilfælde kan du ikke tilføje nye rækker i tabellen, fordi produktposten allerede eksisterer, men du er forpligtet til at opdatere de aktuelle priser for eksisterende produkter.

Det er her UPDATE-forespørgslen kommer i spil. UPDATE-forespørgslen ændrer data i en eksisterende række i databasen. Du kan opdatere alle tabelrækker eller begrænse de berørte rækker for opdateringen ved hjælp af WHERE-sætningen. Normalt udføres SQL-opdateringer for en eksisterende tabel med direkte reference. For eksempel skal et krav i en [medarbejder]-tabel øge alle aktive medarbejderes løn med 10 %. I dette tilfælde vil den direkte reference SQL-forespørgsel være:

Opdater medarbejdersæt [løn]=løn + (løn * 10/100)  hvor [aktiv]=1

Antag, at du har en anden tabel [Adresse], der gemmer medarbejdernes placeringer, og du er forpligtet til at opdatere tabellen [Medarbejder] baseret på de tilgængelige data i tabellen [Adresse]. Hvordan opdaterer du data i tabellen [Medarbejder]?

Heldigvis er der en løsning - OPDATERING fra SELECT-sætning. I det følgende afsnit ser vi på forskellige måder at udføre opdateringer ved hjælp af en SELECT-sætning. For eksempel har tabellen [Medarbejder] NULL-værdier for kolonner – [Postnummer] og [By] i det følgende skærmbillede. Tabellen [Adresse] har værdier for begge kolonner [Postnummer] og [By].

Metode 1:OPDATERING fra SELECT:Join Method

Denne metode bruger SQL Joins til at henvise til den sekundære tabel, der indeholder værdier, der skal opdateres. Derfor bliver måltabellen opdateret med referencekolonnedata for de angivne forhold.

Det er ret ligetil at bruge UPDATE fra SELECT-sætningen i dette tilfælde. Du kan først bruge SELECT-sætningen til at hente referencekolonnen og målkolonnens værdier.

SELECT e.City,A.City, e.PostCode,A.PostCode
FROM Employee e
INNER JOIN
[Address] a
ON e.EmpID = A.EmpID

Dernæst vil du udføre små ændringer i din forespørgsel, og den vil udarbejde en OPDATERING erklæring som vist nedenfor.

  1. Erstat det valgte søgeord med opdatering.
  2. Angiv det tabelnavn eller aliasnavn, der skal opdateres.
  3. Brug et sæt nøgleord og er lig-symbol (=) mellem reference- og målkolonner.
UPDATE e set
e.City=A.City,
e.PostCode=A.PostCode
FROM Employee e
INNER JOIN [Address] a
ON e.EmpID = A.EmpID

Udfør derefter UPDATE-sætningen og kontroller, at kilde- og målkolonneværdierne er de samme.

Metode 2:OPDATERING fra SELECT:MERGE-sætningen

MERGE-sætningen er nyttig til at manipulere data i måltabellen baseret på kildetabeldata for både matchede og umatchede rækker. Det er en alternativ metode til at udføre UPDATE fra SELECT-sætningsfunktionen.

I eksemplet MERGE-sætning nedenfor udføres følgende opgaver:

  • Brug en MERGE-sætning til at opdatere data i tabellen [Medarbejder].
  • Den refererer derefter til en anden tabel, når USING-sætningen anvendes.
  • WHEN MATCHED specificerer derefter flette JOIN (Inner Join) mellem kilde- og måltabellen.
  • Den opdaterer derefter [Postnummer] og [By] fra tabellen [Adresse] til tabellen [Medarbejder] ved hjælp af THEN UPDATE-sætningen efterfulgt af kilde- og målkolonnetilknytninger.
  • MERGE-sætningen slutter altid med et semikolon(;).
MERGE Employee AS e
USING(SELECT * FROM [Address]) AS A
ON A.EmpID=e.EmpID
WHEN MATCHED THEN UPDATE SET
e.PostCode=A.PostCode ,
e.City = A.City;

Metode 3:OPDATERING fra SELECT:Subquery-metode

Underforespørgslen definerer en intern forespørgsel, der kan bruges i en SELECT-, INSERT-, UPDATE- og DELETE-sætning. Det er en ligetil metode til at opdatere de eksisterende tabeldata fra andre tabeller.

UPDATE Employee
SET Employee.City=(SELECT [Address].city
FROM [Address]
WHERE [Address].EmpID = Employee.EmpId)
  • Ovenstående forespørgsel bruger en SELECT-sætning i SET-sætningen i UPDATE-sætningen.
  • Hvis underforespørgslen finder en matchende række, opdaterer opdateringsforespørgslen posterne for den specifikke medarbejder.
  • Hvis underforespørgslen returnerer NULL (ingen matchende række), opdaterer den NULL for den respektive kolonne.
  • Hvis underforespørgslen returnerer mere end én matchet række, rejser UPDATE-sætningen en fejl – "SQL Server Subquery returnerede mere end 1 værdi. Dette er ikke tilladt, når underforespørgslen bruger sammenligningsoperatorer(=, !=, <, <=,>,>=).”

Begrænsninger for underforespørgsler

  • Underforespørgslen med en sammenligningsoperator kan kun indeholde ét kolonnenavn, undtagen hvis den bruges til IN- eller EXISTS-operatoren. Derfor, hvis vi kræver opdatering af flere kolonner med data, har vi brug for separate SQL-sætninger.
  • Du kan ikke bruge ntexttekst og billede datatyper i underforespørgslen.
  • Underforespørgslen kan ikke inkludere GROUP BY og HAVING-udtrykket, hvis underforespørgslen indeholder en umodificeret sammenligningsoperator. Den umodificerede sammenligningsoperator kan ikke bruge søgeordet ANY eller ALL.

Sammenligning af ydeevne mellem forskellige UPDATE fra SELECT-sætninger

I dette afsnit vil vi foretage en præstationssammenligning mellem forskellige OPDATERING fra SELECT-metoder. For at gøre dette starter vi med at udføre SQL-forespørgslerne sammen, aktiverer den faktiske udførelsesplan (Ctrl + M) i SQL Server Management Studio og adskiller dem ved hjælp af Go-sætningen.

I udførelsesplanerne får jeg følgende data til min demo:

  • Deltagelsesmetode har en forespørgselsomkostning på 41 % (i forhold til den samlede batch)
  • MERGE-sætningen har en forespørgselsomkostning på 34 % (i forhold til den samlede batch)
  • Underforespørgselsmetoden har en forespørgselsomkostning på 24 % (i forhold til den samlede batch)

JOIN-metoden bruger 40 % omkostning for den særskilte sortering og 35 % omkostning for opdatering af grupperet indeks.

Sammenfletningen bruger en indre sammenkædning til at matche datarækker mellem kilde- og måldata. Den har også den maksimale relative pris for sorteringsoperatør.

Underforespørgslen er den hurtigste metode til at opdatere kolonnedata. Den bruger klyngeindeksopdateringen og klynget indeksscanning som fremhævet.

For flere detaljer kan du henvise til mine tidligere artikler: SQL Server Execution Plan — Hvad er det, og hvordan hjælper det med ydeevneproblemer? og Sådan læser og analyserer du SQL Server-udførelsesplaner.

Oversigt

Du kan bruge enhver metode, der er angivet i denne artikel, til at udføre UPDATE fra SELECT-sætninger. Underforespørgslen fungerer effektivt, men den har sine egne begrænsninger, som fremhævet tidligere. Den overordnede ydeevne af din database afhænger af tabeldataene, antallet af opdateringer, tabelrelationer, indekser og statistikker.


  1. Docker - Hvordan kan man køre kommandoen psql i postgres containeren?

  2. Sådan laver du nemt CRUD ved hjælp af PHP og MySQL

  3. MySQL SQRT() Funktion – Returner kvadratroden af ​​et tal i MySQL

  4. ORA-01843 er ikke en gyldig måned - Sammenligning af datoer