Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So verwenden Sie UPDATE von SELECT in SQL Server

In diesem Artikel behandeln wir die verschiedenen Methoden zur Verwendung der UPDATE from SELECT-Anweisung in SQL Server.

In der Datenbankwelt werden statische Daten normalerweise nicht gespeichert. Stattdessen ändert es sich ständig, wenn wir vorhandene Daten aktualisieren, irrelevante Daten archivieren oder löschen und vieles mehr. Angenommen, Sie haben eine Tabelle, in der Produktpreisdaten für Ihr Einkaufsportal gespeichert sind. Die Produktpreise ändern sich ständig, da Sie Ihren Kunden möglicherweise Produktrabatte zu unterschiedlichen Zeiten anbieten. In diesem Fall können Sie der Tabelle keine neuen Zeilen hinzufügen, da der Produktdatensatz bereits vorhanden ist, aber Sie müssen die aktuellen Preise für vorhandene Produkte aktualisieren.

Hier kommt die UPDATE-Abfrage ins Spiel. Die UPDATE-Abfrage ändert Daten in einer vorhandenen Zeile in der Datenbank. Mit der WHERE-Klausel können Sie alle Tabellenzeilen aktualisieren oder die betroffenen Zeilen für die Aktualisierung einschränken. Normalerweise werden SQL-Updates für eine vorhandene Tabelle mit direktem Bezug durchgeführt. Beispielsweise muss in einer [Mitarbeiter]-Tabelle das Gehalt aller aktiven Mitarbeiter um 10 % erhöht werden. In diesem Fall lautet die direkte Referenz-SQL-Abfrage:

Aktualisieren Sie den Mitarbeitersatz [Gehalt] =Gehalt + (Gehalt * 10 / 100) , wobei [aktiv] =1

Angenommen, Sie haben eine andere Tabelle [Adresse], in der die Standorte von Mitarbeitern gespeichert sind, und Sie müssen die Tabelle [Mitarbeiter] basierend auf den in der Tabelle [Adresse] verfügbaren Daten aktualisieren. Wie aktualisieren Sie Daten in der Tabelle [Mitarbeiter]?

Glücklicherweise gibt es eine Lösung – UPDATE von der SELECT-Anweisung. Im folgenden Abschnitt betrachten wir verschiedene Möglichkeiten zur Durchführung von Aktualisierungen mit einer SELECT-Anweisung. Beispielsweise enthält die Tabelle [Employee] NULL-Werte für die Spalten – [Postleitzahl] und [Stadt] im folgenden Screenshot. Die Tabelle [Adresse] enthält Werte für beide Spalten [Postleitzahl] und [Stadt].

Methode 1:UPDATE von SELECT:Join-Methode

Diese Methode verwendet SQL-Joins, um auf die sekundäre Tabelle zu verweisen, die Werte enthält, die aktualisiert werden müssen. Daher wird die Zieltabelle mit den Referenzspaltendaten für die angegebenen Bedingungen aktualisiert.

Es ist ziemlich einfach, in diesem Fall die UPDATE from SELECT-Anweisung zu verwenden. Sie können zuerst die SELECT-Anweisung verwenden, um die Werte der Referenzspalte und der Zielspalte abzurufen.

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

Als Nächstes nehmen Sie geringfügige Änderungen an Ihrer Abfrage vor, und es wird eine UPDATE-Anweisung vorbereitet, wie unten gezeigt.

  1. Ersetzen Sie das Schlüsselwort select durch update.
  2. Geben Sie den Tabellennamen oder Aliasnamen an, der aktualisiert werden muss.
  3. Verwenden Sie ein festgelegtes Schlüsselwort und ein Gleichheitszeichen (=) zwischen Verweis- und Zielspalten.
UPDATE e set
e.City=A.City,
e.PostCode=A.PostCode
FROM Employee e
INNER JOIN [Address] a
ON e.EmpID = A.EmpID

Führen Sie dann die UPDATE-Anweisung aus und vergewissern Sie sich, dass die Quell- und Zielspaltenwerte identisch sind.

Methode 2:UPDATE von SELECT:Die MERGE-Anweisung

Die MERGE-Anweisung ist nützlich, um Daten in der Zieltabelle basierend auf den Quelltabellendaten sowohl für übereinstimmende als auch für nicht übereinstimmende Zeilen zu manipulieren. Es ist eine alternative Methode zum Ausführen des UPDATE von der SELECT-Anweisungsfunktion.

In der folgenden Beispiel-MERGE-Anweisung werden die folgenden Aufgaben ausgeführt:

  • Verwenden Sie eine MERGE-Anweisung zum Aktualisieren von Daten in der Tabelle [Employee].
  • Sie verweist dann auf eine andere Tabelle, wenn die USING-Klausel angewendet wird.
  • Das WHEN MATCHED gibt dann den Zusammenführungs-JOIN (Inner Join) zwischen der Quell- und der Zieltabelle an.
  • Dann werden [Postleitzahl] und [Stadt] aus der Tabelle [Adresse] in der Tabelle [Mitarbeiter] aktualisiert, indem die Anweisung THEN UPDATE gefolgt von Quell- und Zielspaltenzuordnungen verwendet wird.
  • Die MERGE-Anweisung endet immer mit einem 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;

Methode 3:UPDATE von SELECT:Subquery-Methode

Die Unterabfrage definiert eine interne Abfrage, die in einer SELECT-, INSERT-, UPDATE- und DELETE-Anweisung verwendet werden kann. Es ist eine unkomplizierte Methode, um die vorhandenen Tabellendaten aus anderen Tabellen zu aktualisieren.

UPDATE Employee
SET Employee.City=(SELECT [Address].city
FROM [Address]
WHERE [Address].EmpID = Employee.EmpId)
  • Die obige Abfrage verwendet eine SELECT-Anweisung in der SET-Klausel der UPDATE-Anweisung.
  • Wenn die Unterabfrage eine übereinstimmende Zeile findet, aktualisiert die Aktualisierungsabfrage die Datensätze für den jeweiligen Mitarbeiter.
  • Wenn die Unterabfrage NULL zurückgibt (keine übereinstimmende Zeile), aktualisiert sie NULL für die entsprechende Spalte.
  • Wenn die Unterabfrage mehr als eine übereinstimmende Zeile zurückgibt, löst die UPDATE-Anweisung einen Fehler aus – „SQL Server-Unterabfrage hat mehr als 1 Wert zurückgegeben. Dies ist nicht zulässig, wenn die Unterabfrage Vergleichsoperatoren (=, !=, <, <=,>,>=) verwendet.“

Einschränkungen für Unterabfragen

  • Die Unterabfrage mit einem Vergleichsoperator kann nur einen Spaltennamen enthalten, außer wenn er für den IN- oder EXISTS-Operator verwendet wird. Wenn wir also mehrere Datenspalten aktualisieren müssen, benötigen wir separate SQL-Anweisungen.
  • Sie können ntext nicht verwenden , Text , und Bild Datentypen in der Unterabfrage.
  • Die Unterabfrage darf nicht GROUP BY und die HAVING-Klausel enthalten, wenn die Unterabfrage einen unveränderten Vergleichsoperator enthält. Der unveränderte Vergleichsoperator kann die Schlüsselwörter ANY oder ALL nicht verwenden.

Leistungsvergleich zwischen verschiedenen UPDATE from SELECT-Anweisungen

In diesem Abschnitt führen wir den Leistungsvergleich zwischen verschiedenen UPDATE from SELECT-Methoden durch. Dazu führen wir zunächst die SQL-Abfragen zusammen aus, aktivieren den eigentlichen Ausführungsplan (Strg + M) in SQL Server Management Studio und trennen sie mithilfe der Go-Anweisung.

In den Ausführungsplänen erhalte ich für meine Demo folgende Daten:

  • Bei der Join-Methode fallen Abfragekosten von 41 % an (relativ zum gesamten Batch)
  • Die MERGE-Anweisung verursacht Abfragekosten von 34 % (relativ zum gesamten Stapel)
  • Die Unterabfragemethode hat Abfragekosten von 24 % (relativ zum Gesamtbatch)

Die JOIN-Methode verwendet 40 % der Kosten für die eindeutige Sortierung und 35 % der Kosten für die Clustered-Index-Aktualisierung.

Der Merge-Join verwendet einen Inner Join, um Datenzeilen zwischen den Quell- und Zieldaten abzugleichen. Es hat auch die maximalen relativen Kosten für den Sortieroperator.

Die Unterabfrage ist die schnellste Methode zum Aktualisieren von Spaltendaten. Es verwendet die Clustered-Index-Aktualisierung und den Clustered-Index-Scan wie hervorgehoben.

Weitere Einzelheiten finden Sie in meinen vorherigen Artikeln: SQL Server-Ausführungsplan – Was ist das und wie hilft er bei Leistungsproblemen? und Lesen und Analysieren von SQL Server-Ausführungsplänen.

Zusammenfassung

Sie können jede in diesem Artikel angegebene Methode zum Ausführen von UPDATE aus SELECT-Anweisungen verwenden. Die Unterabfrage funktioniert effizient, hat aber, wie bereits erwähnt, ihre eigenen Einschränkungen. Die Gesamtleistung Ihrer Datenbank hängt von den Tabellendaten, der Anzahl der Aktualisierungen, Tabellenbeziehungen, Indizes und Statistiken ab.