Ich habe eine Ansicht, die eine Liste von Jobs enthält, mit Daten wie, wem sie zugeordnet sind und die Bühne, in der sie sind. Ich muss eine gespeicherte Prozedur schreiben, die zurückgibt, wie viele Jobs jede Person in jeder Phase hat.Wie führe ich einen Upsert in die Tabelle?
Bisher habe ich diese (vereinfacht):
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
Das Problem dabei ist, dass die Zeilen nicht kombinieren. Wenn ein Mitarbeiter also Jobs in stage1 und stage2 hat, gibt es zwei Zeilen in @ResultTable. Was ich wirklich gerne tun würde, ist, die Zeile zu aktualisieren, falls eine für den Mitarbeiter existiert, und eine neue Zeile einzufügen, falls eine nicht existiert.
Weiß jemand, wie man das macht, oder kann man einen anderen Ansatz vorschlagen? Ich würde wirklich gerne vermeiden, Cursor zu verwenden, um auf der Liste der Benutzer zu iterieren (aber das ist meine Fallback-Option).
Ich bin mit SQL Server 2005.
Edit: @Lee: Leider ist der InStage1 = 1 war eine Vereinfachung. Es ist wirklich mehr wie WHERE DateStarted ist nicht NULL und DateFinished ist NULL.
Bearbeiten: @BCS: Ich mag die Idee, eine Einfügung aller Mitarbeiter zuerst, so dass ich nur ein Update jedes Mal tun müssen. Aber ich habe Mühe, diese UPDATE-Anweisungen zu korrigieren.
die "auf doppelte", die Sie erwähnen, ist INSERT ...ON DUPLICATE KEY UPDATE und die Dokumentation finden Sie hier: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – nickf