Site Overlay

SQLShack (Nederlands)

In dit artikel zullen we verschillende methoden leren die worden gebruikt om de gegevens in een tabel bij te werken met de gegevens van andere tabellen. De” UPDATE from SELECT ” query structuur is de belangrijkste techniek voor het uitvoeren van deze updates.

een update query wordt gebruikt om een bestaande rij of rijen in de database te wijzigen. UPDATEQUERY ‘ s kunnen alle tabelrijen wijzigen, of we kunnen het updatestatement voor bepaalde rijen beperken met behulp van de WHERE-clausule., Meestal gebruiken we constante waarden om de gegevens te wijzigen, zoals de volgende structuren.

de volledige update statement wordt gebruikt om de hele tabel gegevens met dezelfde waarde te wijzigen.,

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

tabel BIJWERKEN
STEL col1 = constant_value1 , col2 = constant_value2 , colN = constant_valueN
WAAR col = val

Echter, voor verschillende scenario ‘ s, deze constante waarde type gebruik niet genoeg voor ons, en we moeten gebruik maken van andere tabellen de gegevens in om te werken op onze tafel., Dit type update statements is een beetje ingewikkeld dan de gebruikelijke structuren. In de volgende secties leren we hoe we dit soort updatequery met verschillende methoden kunnen schrijven, maar eerst moeten we onze voorbeeldgegevens voorbereiden. Dus laten we dit doen.

het voorbereiden van de voorbeeldgegevens

met behulp van de volgende query, zullen we personen en Adreslijsttabellen aanmaken en deze vullen met enkele synthetische gegevens. Deze twee tabellen hebben een relatie door de PersonId kolom, wat betekent dat, in deze twee tabellen, de personid kolom waarde vertegenwoordigt dezelfde persoon.,

UPDATE van SELECT: Join Method

bij deze methode wordt de te updaten tabel samengevoegd met de referentie (secundaire) tabel die nieuwe rijwaarden bevat. Zodat we toegang hebben tot de overeenkomende gegevens van de referentietabel op basis van het opgegeven join type. Tot slot kunnen de kolommen die moeten worden bijgewerkt worden gekoppeld aan kolommen waarnaar wordt verwezen en het updateproces verandert deze kolomwaarden.

in het volgende voorbeeld zullen we de gegevens van de kolommen PersonCityName en PersonPostCode bijwerken met de gegevens van de kolommen stad en PostCode van de AdressList tabel.,

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

Na het uitvoeren van de update van een select-query op de uitgang van de tabel Personen zal worden zoals hieronder weergegeven;

1
SELECTEER * UIT Personen

Laten we proberen te begrijpen van de bovenstaande code:

Wij getypt de naam van de tabel, die zal worden bijgewerkt nadat de UPDATE-instructie., Na het trefwoord instellen Hebben we de kolomnamen opgegeven die moeten worden bijgewerkt en ook hebben we ze vergeleken met de tabelkolommen waarnaar wordt verwezen. Na de FROM-clausule hebben we de tabelnaam opnieuw getypt, die zal worden bijgewerkt. Na de inner JOIN clausule, hebben we de tabel waarnaar wordt verwezen gespecificeerd en deze toegevoegd aan de tabel die moet worden bijgewerkt. Daarnaast kunnen we een WHERE-clausule opgeven en alle kolommen van de tabel waarnaar wordt verwezen of bijgewerkt filteren. We kunnen de query ook herschrijven door aliassen voor tabellen te gebruiken.,

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

Performance Tip:

indexen zijn zeer nuttige databaseobjecten om de query-prestaties in SQL Server te verbeteren. In het bijzonder, als we werken aan de prestaties van de update query, moeten we rekening houden met deze waarschijnlijkheid. Het volgende uitvoeringsplan illustreert een uitvoeringsplan van de vorige query. Het enige verschil is dat deze query bijgewerkt de 3.000.000 rijen van de personen tabel. Deze zoekopdracht werd binnen 68 seconden voltooid.,

We voegden een niet-geclusterde index op personen tabel voordat te updaten en de toegevoegde index omvat de PersonCityName en PersonPostCode kolommen als de index sleutel.

het volgende uitvoeringsplan toont een uitvoeringsplan van dezelfde query, maar deze query werd binnen 130 seconden voltooid vanwege de toegevoegde index, in tegenstelling tot de eerste.

De index-Update-en Sorteeroperators verbruiken 74% kosten van het uitvoeringsplan., We hebben dit duidelijke prestatieverschil tussen dezelfde query gezien vanwege indexgebruik op de bijgewerkte kolommen. Als gevolg hiervan, als de bijgewerkte kolommen worden gebruikt door de indexen, zoals deze, bijvoorbeeld, de query prestaties negatief kunnen worden beïnvloed. In het bijzonder moeten we dit probleem overwegen als we een groot aantal rijen bijwerken. Om dit probleem op te lossen, kunnen we de index uitschakelen of verwijderen voordat we de updatequery uitvoeren.

aan de andere kant wordt een waarschuwingsbord gezien op de sorteeroperator, en het geeft aan dat iets niet goed gaat voor deze operator., Als we de muis over deze operator bewegen, kunnen we de waarschuwingsdetails zien.

tijdens het uitvoeren van de query berekent de query optimizer het benodigde geheugenverbruik voor de query op basis van de geschatte rijnummers en rijgrootte. Deze schatting van het verbruik kan echter om verschillende redenen verkeerd zijn, en als de query meer geheugen vereist dan de schatting, gebruikt het de tempdb-gegevens. Dit mechanisme heet een tempdb lekkage en veroorzaakt prestatieverlies., De reden hiervoor is dat het geheugen altijd sneller is dan de tempdb database omdat de tempdb database de disk resources gebruikt.

u kunt dit SQL Server 2017 zien: SQL Sort, Spill, Memory and Adaptive Memory Grant Feedback fantastisch artikel voor meer details over het probleem met de tempdb-spill.

UPDATE van SELECT: the MERGE statement

het merge statement wordt gebruikt om een doeltabel te manipuleren (invoegen, bijwerken, verwijderen) door te verwijzen naar een brontabel voor de overeenkomende en niet-overeenkomende rijen. Het MERGE statement kan erg handig zijn voor het synchroniseren van de tabel vanaf elke brontabel.,

als we nu teruggaan naar onze positie, kan het MERGE statement gebruikt worden als een alternatieve methode voor het bijwerken van gegevens in een tabel met die in een andere tabel. In deze methode kan de referentietabel worden beschouwd als een brontabel en de doeltabel zal de tabel zijn die moet worden bijgewerkt. De volgende query kan een voorbeeld zijn van deze gebruiksmethode.,

1
2
3
4
5
6
7
8
9

SAMENVOEGEN Personen Per de
met BEHULP van de(SELECT * FROM AddressList) ALS Addr
OP Adres.PersonID = Per.PersonID
indien gevonden, dan stelt
bijwerken
Per in.PersonPostCode=Addr.PostCode,
Per.PersonCityName = Addr.,City;
SELECT * FROM Persons

laten we nu de vorige update van een SELECT query regel voor regel bekijken.,

1
SAMENVOEGEN Personen Per

We hebben getypt de tabel Personen na de instructie SAMENVOEGEN, want het is onze doelstelling tabel, waar we een update, en we gaven Per alias in om gebruik te maken van de rest van de query.,

1
USING(SELECT * FROM AddressList) AS Addr

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

1
ON Addr.PersonID=Per.,PersonID

met behulp van deze syntaxis wordt de verbindingsvoorwaarde gedefinieerd tussen de doel-en brontabel.

1
2
wanneer gematched dan
update set per.PersonPostCode=Addr.,PostCode;

In deze laatste regel van de query hebben we de manipulatiemethode gekozen voor de overeenkomende rijen. Individueel voor deze query hebben we de updatemethode geselecteerd voor de overeenkomende rijen van de doeltabel. Tot slot hebben we het puntkomma (;) teken toegevoegd omdat de MERGE statements moeten eindigen met de puntkomma tekens.

UPDATE van SELECT: Subquery Method

een subquery is een interieurquery die gebruikt kan worden binnen de DML (SELECT, INSERT, UPDATE and DELETE) statements., Het belangrijkste kenmerk van de subquery is, ze kunnen alleen worden uitgevoerd met de externe query.

de subquery methode is de zeer eenvoudige en eenvoudige methode om bestaande gegevens van andere tabellen bij te werken. Het merkbare verschil in deze methode is dat het misschien een handige manier is om een kolom bij te werken voor de tabellen met een klein aantal rijen. Nu zullen we de volgende query uit te voeren en vervolgens zal analyseren.,

1
2
3
4

UPDATE Persons
SET Persons.PersonCityName=(SELECT AddressList.PostCode
FROM AddressList
WHERE AddressList.PersonId = Persons.,r de uitvoering van de update van een select-instructie van de output van de tabel zoals hieronder;

1
SELECTEER * UIT Personen

Zoals we kunnen zien, de PersonCityName kolom gegevens van de tabel Personen zijn bijgewerkt met de Stad kolom gegevens van de AddressList tabel voor de overeenkomende records voor de PersonId kolom., Met betrekking tot deze methode moeten we de volgende belangrijke punten onderstrepen.

  • Als de subquery kon het niet vinden van alle overeenkomstige rij, de bijgewerkte waarde op NULL
  • Als de subquery vindt meer dan één afgestemd rij, de update query retourneert een fout, zoals hieronder weergegeven:

  • aantal keer dat de subquery update methode kan geen bevredigend resultaat

Conclusie

In dit artikel gaan we geleerd om een update van de gegevens in een tabel met de gegevens waar ze zijn opgenomen in andere tabellen., De query structuur, “UPDATE van SELECT” kan worden gebruikt om dit type Data-update scenario uit te voeren. Ook kunnen we alternatieve MERGE statement en subquery methoden gebruiken.

  • Auteur
  • Laatste Berichten
Esat Erkec is een SQL-Server professional die zijn carrière begon 8 jaar geleden als een Software Ontwikkelaar. Hij is een SQL Server Microsoft Certified Solutions Expert., het grootste deel van zijn carrière was gericht op het beheren en ontwikkelen van SQL Server-databases. Zijn huidige interesses liggen in database administratie en Business Intelligence. Je kunt hem vinden op LinkedIn.,
Bekijk alle berichten van Esat Erkec

Laatste berichten door Esat Erkec (zie all)
  • Aan de slag met SQL Programmering – 3 februari 2021
  • Hoe lees ik een uitvoeringsplan met alle details – 28 januari 2021
  • SQL SELECT-TOP-en verliesrekening overzicht en voorbeelden – januari 25, 2021

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *