So führen Sie ein Upsert in SQL Server durch: Kombination von Insert- und Update-Operationen

Bei der Arbeit mit Datenbanken stoßen wir häufig auf Situationen, in denen wir Datensätze verwalten müssen, die möglicherweise bereits existieren oder nicht. Hier kommt das Konzept eines Upsert ins Spiel, das es uns ermöglicht, INSERT- und UPDATE-Operationen nahtlos zu kombinieren. In diesem Blogbeitrag werden wir eine häufige Herausforderung in SQL Server untersuchen und Ihnen eine Lösung bieten, die die Upsert-Logik effektiv implementiert.

Das Problem: Verwaltung von Jobzuweisungen

Stellen Sie sich vor, Sie haben eine Ansicht, die Jobzuweisungen auflistet und zeigt, wer jedem Job zugewiesen ist und in welchem aktuellen Stadium sich dieser befindet. Ihr Ziel ist es, ein gespeichertes Verfahren zu erstellen, das eine Zählung der Jobs für jedes Teammitglied in verschiedenen Stadien zurückgibt.

Der erste Versuch besteht darin, Zählungen in eine temporäre Tabelle einzufügen. Ein entscheidendes Problem tritt jedoch auf, wenn Sie feststellen, dass Teammitglieder mit Jobs in mehr als einem Stadium zu separaten Zeilen in Ihrer Ergebnistabelle führen. Stattdessen benötigen Sie eine Methode, die entweder eine vorhandene Zeile für ein Teammitglied aktualisiert oder eine neue Zeile einfügt, wenn keine vorhanden ist.

Hier ist ein vereinfachtes Beispiel des Codes, mit dem Sie begonnen haben:

DECLARE @ResultTable table 
(
  StaffName nvarchar(100),
  Stage1Count int,
  Stage2Count int
)

INSERT INTO @ResultTable (StaffName, Stage1Count)
  SELECT StaffName, COUNT(*) FROM ViewJob
  WHERE InStage1 = 1
  GROUP BY StaffName

INSERT INTO @ResultTable (StaffName, Stage2Count)
  SELECT StaffName, COUNT(*) FROM ViewJob
  WHERE InStage2 = 1
  GROUP BY StaffName

In diesem Snippet erscheint ein Teammitglied mit Jobs in beiden Stadien zweimal in der @ResultTable, was nicht das gewünschte Ergebnis ist.

Die Lösung: Durchführung eines Upsert

Um dieses Problem anzugehen, müssen wir einen Upsert-Ansatz implementieren, der sowohl das Einfügen als auch das Aktualisieren der Datensätze in der @ResultTable kombiniert. Hier ist eine Schritt-für-Schritt-Analyse, wie man das macht:

Schritt 1: Resultattabelle mit allen Mitarbeitern initialisieren

Beginnen Sie damit, alle Mitarbeiter in Ihre Ergebnistabelle einzufügen, wobei die Anfangszählungen auf null gesetzt sind. Dadurch wird sichergestellt, dass jedes Teammitglied in der Tabelle repräsentiert ist.

INSERT INTO @ResultTable (StaffName, Stage1Count, Stage2Count)
SELECT StaffName, 0, 0 FROM ViewJob
GROUP BY StaffName

Schritt 2: Aktualisieren der Zählungen für die Stadien

Als Nächstes müssen wir die Zählungen für jedes Stadium aktualisieren. Führen Sie die folgenden SQL-Befehle aus, die das UPDATE-Statement verwenden, um die Werte basierend auf den Jobzählungen aus Ihrer Ansicht festzulegen:

Aktualisieren der Stage 1-Zählung

UPDATE @ResultTable
SET Stage1Count = (
  SELECT COUNT(*) FROM ViewJob
  WHERE InStage1 = 1 AND @ResultTable.StaffName = StaffName
)

Aktualisieren der Stage 2-Zählung

UPDATE @ResultTable
SET Stage2Count = (
  SELECT COUNT(*) FROM ViewJob
  WHERE InStage2 = 1 AND @ResultTable.StaffName = StaffName
)

Fazit

Wenn Sie diese Schritte befolgen, erreichen Sie eine effektive Upsert-Operation in SQL Server, ohne auf Cursor oder komplexe Iterationen zurückgreifen zu müssen. Diese Methode ermöglicht es Ihnen, die genauen Jobzählungen für jedes Teammitglied in verschiedenen Stadien in Ihrer Datenbank einfach zu verwalten und aufrechtzuerhalten.

Abschließende Gedanken

Die Nutzung der Upsert-Methodologie verbessert nicht nur die Effizienz Ihrer SQL-Abfragen, sondern vereinfacht auch Ihre Datenbankverwaltungsbemühungen. Eine klare Darstellung der Mitarbeiterzuweisungen wird die Datenanalyse und die Berichtergebnisse erheblich verbessern.

Wenn Sie Fragen haben oder weitere Unterstützung bei Ihren SQL-Abfragen benötigen, zögern Sie nicht, unten in den Kommentaren Kontakt aufzunehmen!