I den här artikeln kommer vi att täcka de olika metoderna för att använda UPDATE from SELECT-satsen i SQL Server.
I databasvärlden lagras vanligtvis inte statisk data. Istället fortsätter det att förändras när vi uppdaterar befintlig data, arkiverar eller raderar irrelevant data och mer. Låt oss till exempel säga att du har en tabell som lagrar produktprisdata för din shoppingportal. Produktpriserna ändras ständigt, eftersom du kan erbjuda produktrabatter vid olika tidpunkter till dina kunder. I det här fallet kan du inte lägga till nya rader i tabellen eftersom produktposten redan finns, men du måste uppdatera de aktuella priserna för befintliga produkter.
Det är här UPDATE-frågan kommer in i bilden. UPDATE-frågan ändrar data i en befintlig rad i databasen. Du kan uppdatera alla tabellrader eller begränsa de berörda raderna för uppdateringen med hjälp av WHERE-satsen. Vanligtvis utförs SQL-uppdateringar för en befintlig tabell med direkt referens. Till exempel, i en [anställd]-tabell måste ett krav öka alla aktiva anställdas löner med 10 %. I det här fallet kommer den direkta referens-SQL-frågan att vara:
Uppdatera personaluppsättning [lön]=lön + (lön * 10/100) där [aktiv]=1
Anta att du har en annan tabell [Adress] som lagrar anställdas platser och att du måste uppdatera tabellen [Anställd] baserat på tillgänglig information i tabellen [Adress]. Hur uppdaterar du data i tabellen [Anställd]?
Lyckligtvis finns det en lösning - UPPDATERING från SELECT-satsen. I följande avsnitt tittar vi på olika sätt att utföra uppdateringar med hjälp av en SELECT-sats. Tabellen [Anställd] har till exempel NULL-värden för kolumner – [Postnummer] och [Stad] i följande skärmdump. Tabellen [Adress] har värden för båda kolumnerna [Postnummer] och [Stad].
Metod 1:UPPDATERING från SELECT:Join Method
Den här metoden använder SQL Joins för att referera till den sekundära tabellen som innehåller värden som behöver uppdateras. Därför uppdateras måltabellen med referenskolumndata för de angivna villkoren.
Det är ganska enkelt att använda UPDATE från SELECT-satsen i det här fallet. Du kan först använda SELECT-satsen för att hämta referenskolumnen och målkolumnvärdena.
SELECT e.City,A.City, e.PostCode,A.PostCode FROM Employee e INNER JOIN [Address] a ON e.EmpID = A.EmpID
Därefter kommer du att göra små ändringar i din fråga, och den kommer att förbereda en UPDATE-sats som visas nedan.
- Ersätt det valda sökordet med uppdatering.
- Ange tabellnamnet eller aliasnamnet som behöver uppdateras.
- Använd ett angivet nyckelord och är lika med symbol (=) mellan referens- och målkolumner.
UPDATE e set e.City=A.City, e.PostCode=A.PostCode FROM Employee e INNER JOIN [Address] a ON e.EmpID = A.EmpID
Kör sedan UPDATE-satsen och verifiera att käll- och målkolumnvärdena är desamma.
Metod 2:UPPDATERING från SELECT:MERGE-satsen
MERGE-satsen är användbar för att manipulera data i måltabellen baserat på källtabellsdata för både matchade och omatchade rader. Det är en alternativ metod för att utföra UPDATE från SELECT-satsfunktionen.
I exemplet MERGE-satsen nedan utförs följande uppgifter:
- Använd en MERGE-sats för att uppdatera data i tabellen [Employee].
- Den refererar sedan till en annan tabell när USING-satsen tillämpas.
- NÄR MATCHED anger sedan sammanfogningen JOIN (Inner Join) mellan käll- och måltabellen.
- Den uppdaterar sedan [Postnummer] och [Stad] från tabellen [Adress] till tabellen [Anställd] med hjälp av THEN UPDATE-satsen följt av mappningar av käll- och målkolumn.
- MERGE-satsen slutar alltid med semikolon(;).
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;
Metod 3:UPPDATERING från SELECT:Subquery-metod
Underfrågan definierar en intern fråga som kan användas i en SELECT-, INSERT-, UPDATE- och DELETE-sats. Det är en enkel metod att uppdatera befintlig tabelldata från andra tabeller.
UPDATE Employee SET Employee.City=(SELECT [Address].city FROM [Address] WHERE [Address].EmpID = Employee.EmpId)
- Ovanstående fråga använder en SELECT-sats i SET-satsen i UPDATE-satsen.
- Om underfrågan hittar en matchande rad, uppdaterar uppdateringsfrågan posterna för den specifika anställde.
- Om underfrågan returnerar NULL (ingen matchande rad), uppdaterar den NULL för respektive kolumn.
- Om underfrågan returnerar mer än en matchad rad, ger UPDATE-satsen ett felmeddelande – "SQL Server Subquery returnerade mer än 1 värde. Detta är inte tillåtet när underfrågan använder jämförelseoperatorer (=, !=, <, <=,>,>=).”
Subquery-begränsningar
- Underfrågan med en jämförelseoperator kan endast innehålla ett kolumnnamn förutom om den används för IN- eller EXISTS-operatorn. Därför, om vi behöver uppdatera flera kolumner med data, behöver vi separata SQL-satser.
- Du kan inte använda ntext , text och bild datatyper i underfrågan.
- Underfrågan kan inte inkludera GROUP BY och HAVING-satsen om underfrågan innehåller en omodifierad jämförelseoperator. Den oförändrade jämförelseoperatorn kan inte använda nyckelordet NÅGOT eller ALLA.
Prestandajämförelse mellan olika UPDATE från SELECT-satser
I det här avsnittet kommer vi att göra en prestandajämförelse mellan olika UPDATE från SELECT-metoder. För att göra detta börjar vi med att köra SQL-frågorna tillsammans, aktivera den faktiska exekveringsplanen (Ctrl + M) i SQL Server Management Studio och separera dem med hjälp av Go-satsen.
I utförandeplanerna får jag följande data för min demo:
- Anslutningsmetoden har en frågekostnad på 41 % (i förhållande till den totala batchen)
- MERGE-satsen har en frågekostnad på 34 % (i förhållande till den totala batchen)
- Undersökningsmetoden har en frågekostnad på 24 % (i förhållande till den totala batchen)
JOIN-metoden använder 40 % kostnad för den distinkta sorteringen och 35 % kostnad för klustrad indexuppdatering.
Sammanfogningen använder en inre koppling för att matcha datarader mellan käll- och måldata. Den har också den maximala relativa kostnaden för sorteringsoperatören.
Underfrågan är den snabbaste metoden att uppdatera kolumndata. Den använder den klustrade indexuppdateringen och klustrade indexskanningen som markerad.
För mer information kan du se mina tidigare artiklar: SQL Server Execution Plan — Vad är det och hur hjälper det med prestandaproblem? och Hur man läser och analyserar SQL Server Execution Plans.
Sammanfattning
Du kan använda vilken metod som helst som anges i den här artikeln för att utföra UPDATE från SELECT-satser. Underfrågan fungerar effektivt, men den har sina egna begränsningar, som belysts tidigare. Det övergripande resultatet för din databas beror på tabelldata, antalet uppdateringar, tabellrelationer, index och statistik.