sql >> Database >  >> RDS >> Sqlserver

Hoe UPDATE van SELECT te gebruiken in SQL Server

In dit artikel behandelen we de verschillende methoden voor het gebruik van de UPDATE from SELECT-instructie in SQL Server.

In de databasewereld worden statische gegevens doorgaans niet opgeslagen. In plaats daarvan blijft het veranderen wanneer we bestaande gegevens bijwerken, irrelevante gegevens archiveren of verwijderen en meer. Stel dat u bijvoorbeeld een tabel heeft waarin productprijsgegevens voor uw winkelportaal zijn opgeslagen. De productprijzen veranderen voortdurend, omdat u uw klanten op verschillende tijdstippen productkortingen kunt aanbieden. In dit geval kunt u geen nieuwe rijen in de tabel toevoegen omdat het productrecord al bestaat, maar u moet de huidige prijzen voor bestaande producten bijwerken.

Dit is waar de UPDATE-query in het spel komt. De UPDATE-query wijzigt gegevens in een bestaande rij in de database. U kunt alle tabelrijen bijwerken of de betreffende rijen voor de update beperken met behulp van de WHERE-component. Meestal worden SQL-updates uitgevoerd voor een bestaande tabel met directe verwijzing. In een [werknemers]tabel moet een vereiste bijvoorbeeld het salaris van alle actieve werknemers met 10% verhogen. In dit geval zal de directe referentie SQL-query zijn:

Werk werknemersset [salaris]=salaris + (salaris * 10/100) waar [actief]=1

. bij

Stel dat u een andere tabel [Adres] heeft waarin de locaties van werknemers zijn opgeslagen en dat u de tabel [Werknemer] moet bijwerken op basis van de gegevens die beschikbaar zijn in de tabel [Adres]. Hoe update je gegevens in de [Werknemer]-tabel?

Gelukkig is er een oplossing - UPDATE van de SELECT-instructie. In de volgende sectie bekijken we verschillende manieren om updates uit te voeren met behulp van een SELECT-instructie. De tabel [Employee] heeft bijvoorbeeld NULL-waarden voor kolommen - [PostCode] en [City] in de volgende schermafbeelding. De tabel [Adres] heeft waarden voor beide kolommen [PostCode] en [Plaats].

Methode 1:UPDATE van SELECT:Deelnamemethode

Deze methode gebruikt SQL-joins om te verwijzen naar de secundaire tabel die waarden bevat die moeten worden geüpdatet. Daarom wordt de doeltabel bijgewerkt met de gegevens van de referentiekolommen voor de gespecificeerde voorwaarden.

Het is vrij eenvoudig om in dit geval de UPDATE from SELECT-instructie te gebruiken. U kunt eerst de SELECT-instructie gebruiken om de waarden van de referentiekolom en de doelkolom op te halen.

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

Vervolgens voert u kleine wijzigingen in uw zoekopdracht uit en bereidt het een UPDATE-statement voor, zoals hieronder weergegeven.

  1. Vervang het geselecteerde trefwoord door update.
  2. Geef de tabelnaam of aliasnaam op die moet worden bijgewerkt.
  3. Gebruik een ingesteld zoekwoord en is gelijk aan symbool (=) tussen verwijzende en doelkolommen.
UPDATE e set
e.City=A.City,
e.PostCode=A.PostCode
FROM Employee e
INNER JOIN [Address] a
ON e.EmpID = A.EmpID

Voer vervolgens de UPDATE-instructie uit en controleer of de bron- en doelkolomwaarden hetzelfde zijn.

Methode 2:UPDATE van SELECT:De MERGE-instructie

De MERGE-instructie is handig voor het manipuleren van gegevens in de doeltabel op basis van de brontabelgegevens voor zowel overeenkomende als niet-overeenkomende rijen. Het is een alternatieve methode voor het uitvoeren van de UPDATE vanuit de SELECT-instructiefunctie.

In het onderstaande voorbeeld MERGE-statement worden de volgende taken uitgevoerd:

  • Gebruik een MERGE-instructie voor het bijwerken van gegevens in de [Employee]-tabel.
  • Het verwijst dan naar een andere tabel wanneer de clausule USING wordt toegepast.
  • De WHEN MATCHED specificeert vervolgens de merge JOIN (Inner Join) tussen de bron- en doeltabel.
  • Vervolgens werkt het de [PostCode] en [Plaats] bij van de [Address]-tabel naar de [Employee]-tabel met behulp van de THEN UPDATE-instructie gevolgd door de toewijzingen van de bron- en doelkolommen.
  • Het MERGE-statement eindigt altijd met een puntkomma(;).
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;

Methode 3:UPDATE van SELECT:Subquery-methode

De subquery definieert een interne query die kan worden gebruikt in een SELECT-, INSERT-, UPDATE- en DELETE-instructie. Het is een eenvoudige methode om de bestaande tabelgegevens van andere tabellen bij te werken.

UPDATE Employee
SET Employee.City=(SELECT [Address].city
FROM [Address]
WHERE [Address].EmpID = Employee.EmpId)
  • De bovenstaande query gebruikt een SELECT-instructie in de SET-clausule van de UPDATE-instructie.
  • Als de subquery een overeenkomende rij vindt, werkt de updatequery de records voor de specifieke werknemer bij.
  • Als de subquery NULL retourneert (geen overeenkomende rij), wordt NULL voor de respectieve kolom bijgewerkt.
  • Als de subquery meer dan één overeenkomende rij retourneert, geeft de UPDATE-instructie een fout:"SQL Server Subquery heeft meer dan 1 waarde geretourneerd. Dit is niet toegestaan ​​wanneer de subquery vergelijkingsoperators(=, !=, <, <=,>,>=) gebruikt.”

Subquerybeperkingen

  • De subquery met een vergelijkingsoperator kan slechts één kolomnaam bevatten, behalve als deze wordt gebruikt voor de IN- of EXISTS-operator. Daarom hebben we aparte SQL-instructies nodig als we meerdere kolommen met gegevens moeten bijwerken.
  • U kunt ntext . niet gebruiken , tekst , en afbeelding gegevenstypen in de subquery.
  • De subquery kan geen GROUP BY en de HAVING-component bevatten als de subquery een ongewijzigde vergelijkingsoperator bevat. De ongewijzigde vergelijkingsoperator kan het trefwoord ANY of ALL niet gebruiken.

Prestatievergelijking tussen verschillende UPDATE van SELECT-instructies

In deze sectie zullen we de prestatievergelijking maken tussen verschillende UPDATE from SELECT-methoden. Om dit te doen, beginnen we door de SQL-query's samen uit te voeren, het daadwerkelijke uitvoeringsplan (Ctrl + M) in SQL Server Management Studio in te schakelen en ze te scheiden met behulp van de Go-instructie.

In de uitvoeringsplannen krijg ik de volgende gegevens voor mijn demo:

  • Deelnamemethode kost 41% querykosten (ten opzichte van de totale batch)
  • De MERGE-instructie heeft een querykost van 34% (ten opzichte van de totale batch)
  • De subquerymethode heeft 24% querykosten (ten opzichte van de totale batch)

De JOIN-methode gebruikt 40% kosten voor de afzonderlijke sortering en 35% kosten voor geclusterde indexupdate.

De merge-join gebruikt een inner join voor het matchen van gegevensrijen tussen de bron- en doelgegevens. Het heeft ook de maximale relatieve kosten voor de sorteeroperator.

De subquery is de snelste methode om kolomgegevens bij te werken. Het gebruikt de geclusterde index-update en geclusterde index-scan zoals gemarkeerd.

Voor meer details kunt u mijn eerdere artikelen raadplegen:SQL Server Execution Plan — Wat is het en hoe helpt het bij prestatieproblemen? en Hoe u uitvoeringsplannen voor SQL Server kunt lezen en analyseren.

Samenvatting

U kunt elke methode gebruiken die in dit artikel wordt gespecificeerd om UPDATE uit te voeren vanuit SELECT-instructies. De subquery werkt efficiënt, maar heeft zijn eigen beperkingen, zoals eerder aangegeven. De algehele prestaties van uw database zijn afhankelijk van de tabelgegevens, het aantal updates, tabelrelaties, indexen en statistieken.


  1. Database laten vallen met behulp van TSQL en GUI - SQL Server / TSQL-zelfstudie, deel 25

  2. Waarom respecteert PL/SQL de door Rollen verleende privileges niet?

  3. Converteer tijdstempel naar datum in MySQL-query

  4. Hoe u consequent een Microsoft Access MVP Award kunt verdienen