Site Overlay

SQLShack (Norsk)

I denne artikkelen, vi vil lære forskjellige metoder som brukes til å oppdatere data i en tabell med data fra andre tabeller. «OPPDATERE fra VELG» spørring struktur er den viktigste teknikken for å utføre disse oppdateringene.

En oppdateringsspørring brukes til å endre en eksisterende rad-eller rader i databasen. OPPDATERING forespørsler kan endre alle tabeller rader, eller vi kan begrense oppdatering uttalelse rammer for den enkelte rader med hjelp av WHERE-setningsdel., For det meste, vi bruker konstante verdier for å endre data, for eksempel følgende strukturer.

full update-setningen brukes til å endre hele tabellen data med samme verdi.,

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

OPPDATER tabell
ANGI col1 = constant_value1 , col2 = constant_value2 , colN = constant_valueN
HVOR col = val

Imidlertid for ulike scenarier, denne konstante verdien bruk typen kan være nok for oss, og vi må bruke andre tabeller’ data for å oppdatere våre bord., Denne typen oppdateringer uttalelser er litt mer komplisert enn de vanlige strukturer. I de følgende avsnittene vil vi lære hvordan å skrive denne type oppdateringsspørring med forskjellige metoder, men først må vi forberede våre utvalgte data. Så la oss gjøre dette.

Klargjøre eksempeldata

ved hjelp av følgende spørring, vil vi skape Mennesker og AddressList tabeller og fylle dem med noen syntetiske data. Disse to tabellene har et forhold gjennom PersonId kolonnen, noe som betyr at i disse to tabellene, PersonId kolonnen verdi representerer den samme personen.,

OPPDATERE fra SELECT: Bli med Metode

I denne metoden, tabellen oppdateres vil være sammen med referansen (sekundær) tabell som inneholder ny rad verdier. Slik at vi kan få tilgang til matchet data for referanse tabell basert på den angitte bli med type. Til slutt, kolonner for å være oppdatert kan bli matchet med refereres til kolonner og oppdateringen endrer disse kolonne verdier.

I det følgende eksemplet, vi vil oppdatere PersonCityName og PersonPostCode kolonner med data Byen og Postnummer kolonner data om AdressList bordet.,

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.,

Etter gjennomføring av oppdateringen fra en select-spørring utgangen av Mennesker tabellen vil bli som vist nedenfor;

1
VELG * FRA Personer

La oss prøve å forstå koden ovenfor:

Vi har skrevet navnet til bordet, som vil bli oppdatert etter OPPDATERINGEN uttalelse., Etter ANGITT søkeord, vi er angitt i kolonnen navn for å være oppdatert, og vi matchet dem med referansetabellen kolonner. Etter FRA-punkt, vi retyped bordet, som vil være oppdatert. Etter INNER JOIN-setningsdel, vi er angitt referansetabellen, og ble med til bordet for å være oppdatert. I tillegg til dette, kan vi angi en WHERE-setningsdel og filter noen kolonner av den refererte eller oppdatert tabell. Vi kan også skrive spørring ved hjelp av aliaser for 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

Ytelse Tips:

Indekser er veldig nyttige database objekter for å forbedre ytelse i SQL Server. Spesielt, hvis vi jobber på resultatene av den oppdateringsspørring, bør vi ta hensyn til denne sannsynligheten. Følgende gjennomføringsplan illustrerer en gjennomføringsplan over tidligere søkeord. Den eneste forskjellen er at denne spørringen oppdatert 3.000.000 rader av Personer bordet. Dette søket ble gjennomført i løpet 68 sekunder.,

Vi har lagt til en ikke-samlet indeks på Personer bordet før for å oppdatere og lagt indeks innebærer PersonCityName og PersonPostCode kolonner som index-tasten.

følgende gjennomføringsplan er å demonstrere en gjennomføringsplan av den samme spørringen, men dette søket ble avsluttet innen 130 sekunder på grunn av den ekstra indeks, i motsetning til den første.

Indeksen Oppdatering og Sortere operatører bruker 74% kostnaden av gjennomføringsplan., Vi har sett dette tydelig ytelse forskjellen mellom den samme spørringen på grunn av indeks-bruk på den oppdaterte kolonner. Som et resultat, hvis oppdatert kolonner blir brukt av indekser, som dette, for eksempel spørringen ytelse kan bli påvirket negativt. I særdeleshet, bør vi vurdere dette problemet hvis vi vil oppdatere et stort antall rader. For å overvinne dette problemet, kan vi deaktivere eller fjerne indeksen før du utfører oppdateringen spørring.

På den annen side, et faresignal er sett på Sorter operatør, og det indikerer at noe ikke går bra for denne operatøren., Når vi beveger du musepekeren over dette nettet, kan vi se advarsel detaljer.

Under utførelsen av spørringen, query optimizer beregner en nødvendig minneforbruket for spørring basert på estimert rad tall og rad størrelse. Imidlertid, dette forbruket estimering kan være feil for en rekke årsaker, og hvis spørringen krever mer minne enn det estimering, bruker den tempdb data. Denne mekanismen kalles en tempdb utslipp og fører til ytelse tap., Grunnen til dette: minnet alltid raskere enn tempdb database fordi tempdb databasen bruker disk ressurser.

Du kan se denne SQL Server-2017: SQL Sortere, Søl, Minne og Adaptive Memory Gi Tilbakemelding fantastisk artikkel for mer informasjon om tempdb utslipp problemet.

OPPDATERE fra SELECT: MERGE-setningen

MERGE-setningen brukes til å manipulere (INSERT, UPDATE, DELETE) et mål tabellen ved å referere til en kilde tabell for matchede og umatchede rader. MERGE-setningen kan være svært nyttig for synkronisering av tabellen fra enhver kilde bordet.,

Nå, hvis vi går tilbake til vår posisjon, MERGE-setningen kan brukes som en alternativ metode for å oppdatere data i en tabell med de som er i en annen tabell. I denne metoden, referanse tabellen kan bli tenkt på som en kilde bord og målet tabellen vil bli tabellen for å bli oppdatert. Følgende spørring kan være et eksempel på dette bruk metoden.,

1
2
3
4
5
6
7
8
9

slå sammen Personer SOM Per
BRUKER(SELECT * FROM AddressList) SOM Adr
PÅ-Adr.PersonID=Per.PersonID
NÅR MATCHET DERETTER
OPPDATER ANGI
Per.PersonPostCode=Adr.Postnummer
Per.PersonCityName = Adr.,Byen;
SELECT * FROM Personer

la oss Nå takle den forrige oppdateringen fra en select-spørring linje for linje.,

1
FLETT Personer SOM Per

Vi har skrevet Personer bordet etter MERGE-setningen fordi det er målet vårt bord, som vi ønsker å oppdatere, og vi ga Per alias til den for å bruke resten av spørringen.,

1
USING(SELECT * FROM AddressList) AS Addr

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

1
ON Addr.PersonID=Per.,PersonID

ved hjelp av denne syntaks, bli med i tilstand er definert mellom mål og kilde for tabellen.

1
2

NÅR MATCHET DERETTER
OPPDATER SETT Per.PersonPostCode=Adr.,Postnummer;

I denne siste linjen i søket, vi valgte manipulasjon metode for matchende rader. Individuelt for dette søket, vi har valgt OPPDATERING metode for matchende rader av målet bordet. Til slutt, vi har lagt til semikolon (;) tegn fordi MERGE uttalelser må avsluttes med semikolon tegn.

OPPDATERE fra SELECT: Subquery Metode

En subquery er en interiør-spørring som kan brukes inne i DML (SELECT, INSERT, UPDATE og DELETE) uttalelser., Den viktigste karakteristisk for de subquery er, de kan bare utføres med ekstern spørring.

subquery metoden er svært grunnleggende og enkel metode for å oppdatere eksisterende data fra andre tabeller data. Den merkbare forskjellen i denne metoden, kan det være en praktisk måte å oppdatere en kolonne for tabeller som har et lite antall rader. Nå vil vi utfører følgende spørring og deretter vil analysere den.,

1
2
3
4

UPDATE Persons
SET Persons.PersonCityName=(SELECT AddressList.PostCode
FROM AddressList
WHERE AddressList.PersonId = Persons.,r utførelsen av oppdateringen fra en select-setning utgangen av tabellen vil være som følger;

1
VELG * FRA Personer

Som vi kan se, PersonCityName kolonne data om Personer tabellen har blitt oppdatert med Byen kolonne data om AddressList tabell for matchet oppføringer for PersonId kolonne., Om denne metoden, bør vi understreke følgende vesentlige punkter.

  • Hvis subquery kunne ikke finne noen matchet rad, den oppdaterte verdien settes til NULL
  • Hvis subquery finner mer enn ett matchet hverandre, oppdatere søket vil returnere en feil, som vist nedenfor:

  • Mange ganger subquery update-metoden kan ikke tilby tilfredsstillende ytelse

Konklusjon

I denne artikkelen, vi lærte å oppdatere data i en tabell med data der de finnes i andre tabeller., Søket struktur, «OPPDATERE fra SELECT» kan brukes til å utføre denne type data oppdatering scenario. Også, kan vi bruke alternative MERGE-setningen og subquery metoder.

  • Forfatter
  • Siste Innlegg
Esat Erkec er en SQL Server-profesjonelle som begynte sin karriere 8+ år siden som en programvareutvikler. Han er en SQL Server-Microsoft Certified Solutions Ekspert.,
de Fleste av hans karriere har vært fokusert på SQL Server-Database Administrasjon og Utvikling. Hans nåværende interesser er i database administrasjon og Business Intelligence. Du finner ham på LinkedIn.,
Vis alle innlegg av Esat Erkec

Siste innlegg av Esat Erkec (se alle)
  • Komme i gang med SQL-Programmering – februar 3, 2021
  • Hvordan å lese en gjennomføringsplan med alle detaljer – 28. januar 2021
  • SQL SELECT TOPPEN uttalelse oversikt og eksempler – 25 januar 2021

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *