Site Overlay

SQLShack (Dansk)

I denne artikel, vi vil lære forskellige metoder, der er brugt til at opdatere data i en tabel med data fra andre tabeller. Forespørgselsstrukturen” Opdater fra Vælg ” er den vigtigste teknik til at udføre disse opdateringer.

en OPDATERINGSFORESPØRGSEL bruges til at ændre en eksisterende række eller rækker i databasen. Opdater forespørgsler kan ændre alle tabeller rækker, eller vi kan begrænse opdateringen erklæring påvirker for de bestemte rækker ved hjælp af clausehere klausul., For det meste bruger vi konstante værdier til at ændre dataene, såsom følgende strukturer.

den fulde opdateringserklæring bruges til at ændre hele tabeldata med samme værdi.,

1
2

UPDATE table
SET col1 = constant_value1 , col2 = constant_value2 , colN = constant_valueN

The conditional update statement is used to change the data that satisfies the WHERE condition.,

1
2
3

OPDATER tabel
SÆT col1 = constant_value1 , col2 = constant_value2 , colN = constant_valueN
HVOR col = val

Men, for forskellige scenarier, denne konstante værdi skik type kan ikke være nok for os, og vi er nødt til at bruge andre tabeller’ data med henblik på at opdatere vores bord., Denne type opdateringsopgørelser er lidt kompliceret end de sædvanlige strukturer. I de følgende afsnit lærer vi, hvordan vi skriver denne type opdateringsforespørgsel med forskellige metoder, men i første omgang skal vi forberede vores eksempeldata. Så lad os gøre det.

forberedelse af prøvedata

Ved hjælp af følgende forespørgsel opretter vi person-og Adresselistetabeller og udfylder dem med nogle syntetiske data. Disse to tabeller har et forhold gennem personid-kolonnen, hvilket betyder, at i disse to tabeller repræsenterer personid-kolonneværdien den samme person.,

opdatering fra SELECT: Join Method

i denne metode vil tabellen, der skal opdateres, blive forbundet med referencetabellen (sekundær), der indeholder nye rækkeværdier. Så vi kan få adgang til de matchede data i referencetabellen baseret på den specificerede sammensætningstype. Endelig kan de kolonner, der skal opdateres, matches med refererede kolonner, og opdateringsprocessen ændrer disse kolonneværdier.

i det følgende eksempel vil vi opdatere PersonCityName og PersonPostCode kolonner data med byen og Postnummer kolonner data i adresseliste tabellen.,

1
2
3
4
5
6
7
8

UPDATE Per
SET
Per.PersonCityName=Addr.City,
Per.PersonPostCode=Addr.PostCode
FROM Persons Per
INNER JOIN
AddressList Addr
ON Per.PersonId = Addr.,

Efter udførelse af opdatering fra en select query output tabellen Personer vil være som vist nedenfor.

1
VÆLG * FRA Personer

Lad os prøve at forstå ovenstående kode:

Vi har skrevet bordet navn, der vil blive opdateret efter UPDATE-sætning., Efter det indstillede søgeord specificerede vi kolonnenavne, der skulle opdateres, og vi matchede dem også med de refererede tabelkolonner. Efter fra-klausulen indtastede vi bordnavnet igen, som vil blive opdateret. Efter Inner JOIN-klausulen specificerede vi den refererede tabel og sluttede den til tabellen, der skulle opdateres. Derudover kan vi specificere en clausehere-klausul og filtrere alle kolonner i den refererede eller opdaterede tabel. Vi kan også omskrive forespørgslen ved at bruge aliaser til tabeller.,

1
2
3
4
5
6
7
8

UPDATE Per
SET
Per.PersonCityName=Addr.City,
Per.PersonPostCode=Addr.PostCode
FROM Persons Per
INNER JOIN
AddressList Addr
ON Per.PersonId = Addr.,PersonId

Ydeevne Tip:

Indekser er meget hjælpsomme database objekter til at forbedre forespørgsel resultater i SQL Server. Især hvis vi arbejder på udførelsen af opdateringsforespørgslen, skal vi tage højde for denne sandsynlighed. Følgende udførelsesplan illustrerer en udførelsesplan for den foregående forespørgsel. Den eneste forskel er, at denne forespørgsel opdaterede 3.000.000 rækkerne i tabellen personer. Denne forespørgsel blev afsluttet inden for 68 sekunder.,

Vi tilføjede et ikke-grupperet indeks på personers tabel før for at opdatere, og det tilføjede indeks involverer personcityname og PersonPostCode kolonner som indeksnøgle.

følgende eksekveringsplan viser en eksekveringsplan for den samme forespørgsel, men denne forespørgsel blev afsluttet inden for 130 sekunder på grund af det tilføjede indeks, i modsætning til det første.

Indeksopdateringen og sorteringen af operatørerne forbruger 74% omkostninger til eksekveringsplanen., Vi har set denne åbenlyse ydelsesforskel mellem den samme forespørgsel på grund af indeksforbrug på de opdaterede kolonner. Som et resultat, hvis de opdaterede kolonner bliver brugt af indekserne, som dette, for eksempel, forespørgslen ydeevne kan blive påvirket negativt. Især bør vi overveje dette problem, hvis vi opdaterer et stort antal rækker. For at overvinde dette problem kan vi deaktivere eller fjerne indekset, før vi udfører opdateringsforespørgslen.

På den anden side ses et advarselsskilt på sorteringsoperatøren, og det indikerer, at noget ikke går godt for denne operatør., Når vi svæver musen over denne operatør, kan vi se advarselsoplysningerne.

Under udførelse af den forespørgsel, query optimizer beregner en nødvendig hukommelsesforbruget for den forespørgsel, der er baseret på den estimerede række tal og træk størrelse. Imidlertid kan dette forbrugsestimering være forkert af forskellige årsager, og hvis forespørgslen kræver mere hukommelse end estimeringen, bruger den tempdb-dataene. Denne mekanisme kaldes en tempdb spill og forårsager tab af ydeevne., Årsagen til dette: hukommelsen er altid hurtigere end tempdb-databasen, fordi tempdb-databasen bruger diskressourcerne.

Du kan se denne S .l Server 2017: s .l sortere, spilde, hukommelse og adaptiv hukommelse give Feedback fantastisk artikel for flere detaljer om tempdb spill problem.

opdatering fra SELECT: MERGE-sætningen

MERGE-sætningen bruges til at manipulere (indsætte, opdatere, slette) en måltabel ved at henvise til en kildetabel for de matchede og uovertrufne rækker. FUSIONSOPGØRELSEN kan være meget nyttig til synkronisering af tabellen fra enhver kildetabel.,hvis vi nu går tilbage til vores position, kan FUSIONSERKLÆRINGEN bruges som en alternativ metode til opdatering af data i en tabel med dem i en anden tabel. I denne metode kan referencetabellen betragtes som en kildetabel, og måltabellen vil være den tabel, der skal opdateres. Følgende forespørgsel kan være et eksempel på denne brugsmetode.,

1
2
3
4
5
6
7
8
9

FLET Personer, SOM Pr
HJÆLP(SELECT * FROM AddressList) SOM Adr
PÅ Adr.PersonID=Pr.PersonID
når matchet derefter
OPDATERINGSSÆT
pr.PersonPostCode=Addr.Postnummer,
pr.PersonCityName = Addr.,City;
SELECT * FROM Personer

lad os Nu løse den foregående opdatering fra en select query linje for linje.,

1
FLET Personer, SOM Pr

Vi har skrevet de Personer bordet efter MERGE erklæring, fordi det er vores mål bordet, som vi ønsker at opdatere, og vi gav Per alias til det, for at bruge resten af forespørgslen.,

1
USING(SELECT * FROM AddressList) AS Addr

After the USING statement, we have specified the source table.

1
ON Addr.PersonID=Per.,PersonID

Ved hjælp af denne syntaks defineres tilslutningsbetingelsen mellem mål-og kildetabellen.

1
2

NÅR MATCHES DEREFTER
UPDATE SET Pr.PersonPostCode=Addr.,Postnummer;

I denne sidste linje af forespørgslen, valgte vi manipulation metode for de matchede rækker. Individuelt for denne forespørgsel har vi valgt opdateringsmetoden for de matchede rækker i måltabellen. Endelig tilføjede vi semikolon (;) – tegnet, fordi FUSIONSOPGØRELSERNE skal ende med semikolon-tegnene.

opdatering fra SELECT: Sub Methoduery Method

en suberyuery er en interiør forespørgsel, der kan bruges inde i DML (SELECT, INSERT, UPDATE and DELETE) udsagn., Den vigtigste egenskab ved underforespørgslen er, de kan kun udføres med den eksterne forespørgsel.

underforespørgselmetoden er den meget grundlæggende og nemme metode til at opdatere eksisterende data fra andre tabellers data. Den mærkbare forskel i denne metode er, det kan være en bekvem måde at opdatere en kolonne til tabellerne, der har et lille antal rækker. Nu vil vi udføre følgende forespørgsel og derefter analysere det.,

1
2
3
4

UPDATE Persons
SET Persons.PersonCityName=(SELECT AddressList.PostCode
FROM AddressList
WHERE AddressList.PersonId = Persons.,r udførelse af opdatering fra en select-sætning produktionen af tabellen vil være som følgende;

1
VÆLG * FRA Personer

Som vi kan se, PersonCityName kolonne data i tabellen Personer er blevet opdateret med Byen kolonne data AddressList tabel for de matchede poster for PersonId kolonne., Med hensyn til denne metode bør vi understrege følgende vigtige punkter.

  • Hvis underforespørgsel kunne ikke finde nogen matchede træk, den opdaterede værdi vil blive ændret til NULL
  • Hvis underforespørgsel finder mere end ét matchede træk, opdateringen vil forespørgslen returnerer en fejl, som vist nedenfor:

  • Mange gange underforespørgsel update metode kan ikke give tilfredsstillende resultater

Konklusion

I denne artikel, vi har lært at opdatere dataene i en tabel med data, hvis de er indeholdt i andre tabeller., Forespørgselsstrukturen,” Opdater fra vælg”, kan bruges til at udføre denne type dataopdateringsscenarie. Vi kan også bruge alternative Flet erklæring og suberyuery metoder.

  • Forfatter
  • Seneste Indlæg
Esat Erkec er en SQL Server-professionelle, der begyndte sin karriere 8+ år siden som en Software-Udvikler. Han er en S .l Server Microsoft Certified Solutions e .pert.,
det meste af hans karriere har været fokuseret på S .l Server Database Administration og udvikling. Hans nuværende interesser er i database administration og Business Intelligence. Du kan finde ham på LinkedIn.,
Vis alle indlæg af Esat Erkec

Seneste indlæg af Esat Erkec (se alle)
  • Kom godt i gang med SQL Programmering – februar 3, 2021
  • Hvordan man kan læse en gennemførelsesplan med alle detaljer – januar 28, 2021
  • SQL SELECT-TOP erklæring oversigt og eksempler – 25 januar 2021

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *