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.
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.,
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ætningenMERGE-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.,
lad os Nu løse den foregående opdatering fra en select query linje for linje.,
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.,
After the USING statement, we have specified the source table.
Ved hjælp af denne syntaks defineres tilslutningsbetingelsen mellem mål-og kildetabellen.
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 Methoden 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.,
|