2013-06-05 8 views
11

Ich habe eine Frage bezüglich der folgenden Syntax. Gibt es einen saubereren Weg, um dies in eine Aussage anstatt in zwei zu rollen? Ich habe mehrere Iterationen ausprobiert, aber dies scheint der einzige Weg zu sein, wie ich diese beiden Anweisungen erfolgreich ausführen kann.Update-Anweisung zum Aktualisieren mehrerer Zeilen

UPDATE employee 
SET hire_date = '1979-03-15' 
WHERE emp_id = 'PMA42628M' 

UPDATE employee 
SET hire_date = '1988-12-22' 
where emp_id = 'PSA89086M'; 

Ich versuchte dies auch und ich versuchte es auch mit einer UND-Anweisung. Keine funktionierte. Im Grunde bin ich auf der Suche nach einem weniger Anfänger als die oben genannte Methode, wenn eine existiert. Ich habe lange gesucht und keine gefunden.

UPDATE employee 
SET hire_date = ('1979-03-15', '1988-12-22') 
WHERE emp_id = ('PMA42628M', 'PSA89086M'); 

Appriciate jeden Rat auf diesem einen, und nebenbei verwende ich SQL Server. Dank

Antwort

18

versuchen diese, wird dies mehrere wählt kombinieren und gibt sie, als ob sie von der DB kommen:

UPDATE e 
SET hire_date = t.hire_date 
FROM dbo.employee e 
JOIN (
    SELECT emp_id = 'PMA42628M', hire_date = '1979-03-15' 
    UNION ALL 
    SELECT emp_id = 'PSA89086M', hire_date = '1988-12-22' 
) t ON t.emp_id = e.emp_id 

Wenn Sie SQL Server 2008 verwenden oder eine neuere Version, können Sie auch eine andere verwenden könnte Syntax für die abgeleitete Tabelle:

UPDATE e 
SET hire_date = t.hire_date 
FROM dbo.employee e 
JOIN (
    VALUES 
     ('PMA42628M', '1979-03-15'), 
     ('PSA89086M', '1988-12-22') 
) t (emp_id, hire_date) ON t.emp_id = e.emp_id 
+0

ist das Schlüsselwort 'AS' nicht doppelt vorhanden? – Zim84

+0

Ich verwende in dieser Situation kein AS-Schlüsselwort, weil es unnötig ist. – Devart

+0

@ Zim84 und danke für Ihre Bewertung. – Devart

7

ich suche eine weniger newbie Weise

Zwei separate update-Anweisungen zu machen ist (meiner Meinung nach) "der weniger Neuling Weg" Sie könnten Sachen komplizieren und so etwas tun.

update employee 
set hire_date = case emp_id 
        when 'PMA42628M' then '1979-03-15' 
        when 'PSA89086M' then '1988-12-22' 
       end 
where emp_id in ('PMA42628M', 'PSA89086M') 

aber was würde Ihnen das bringen? Das gesamte Update würde in einer impliziten Transaktion ausgeführt werden. Wenn Sie also möchten, dass sich Ihre beiden Aktualisierungen in einer Transaktion befinden, verwenden Sie einfach begin transaction .... commit.

+0

Ich landete auf dieser Frage, weil ich nach einer Möglichkeit suchte, eine langsame (interaktive) Anwendung zu optimieren, die im Verlauf einer Minute etwa 100.000 Update-Anweisungen ausführt . Der Wechsel zu einer kombinierten Variante wie vorgeschlagen hat uns eine Beschleunigung von 700% gebracht, so dass wir jetzt die gleiche Arbeit in weniger als zehn Sekunden machen. Alles in eine Transkation zu bringen, hilft nicht, da es die Dispatch- und Roundtrip-Zeit für alle SQL-Anweisungen ist, die die meiste Zeit beanspruchen. – flodin

3

Zu den anderen bereits erwähnten Möglichkeiten hinzufügen: Sie können eine temporäre Tabelle oder eine Tabellenvariable mit den gewünschten Aktualisierungen erstellen und dann die UPDATE Anweisung ausführen, die die Tabelle mit der zu aktualisierenden Tabelle verknüpft.

Beachten Sie, dass Sie für zwei Updates zwei Anweisungen erhalten: die INSERT in die Update-Tabelle und die UPDATE-Anweisung selbst. Die Anzahl der Anweisungen bleibt zwei, wenn Sie so viele Aktualisierungen durchführen müssen.

CREATE TABLE #employee (emp_id VARCHAR(9) NOT NULL PRIMARY KEY,hire_date DATE NOT NULL); 
INSERT INTO #employee (emp_id,hire_date) 
VALUES ('PMA42628M','2013-06-05'),('PSA89086M','2013-06-05'); 

CREATE TABLE #target_updates(emp_id VARCHAR(9) NOT NULL,hire_date DATE NOT NULL); 
INSERT INTO #target_updates (emp_id,hire_date) 
VALUES ('PMA42628M','1979-03-15'),('PSA89086M','1988-12-22'); 

UPDATE 
    #employee 
SET 
    hire_date=tu.hire_date 
FROM 
    #employee AS e 
    INNER JOIN #target_updates AS tu ON 
     tu.emp_id=e.emp_id; 

SELECT 
    * 
FROM 
    #employee 
ORDER BY 
    emp_id; 

DROP TABLE #target_updates; 
DROP TABLE #employee; 
+1

Diese SHD ist die akzeptierte Antwort, da sie für die Aktualisierung von n Zeilenanzahl aus einer Tabelle gilt, die bereits vorhanden ist –

Verwandte Themen