2012-04-04 4 views
3
UPDATE table1 
SET col = 1 
WHERE col2 = 'xyz' 


UPDATE a 
SET col = 1 
FROM table1 a 
WHERE col2 = 'xyz' 

Welches ist bevorzugt?Gibt es einen Unterschied zwischen diesen beiden einfachen SQL Update-Anweisungen?

Ein Unterschied, den ich herausfinden konnte, war, dass die zweite Anweisung es ermöglicht, WITH NO LOCK in der Nähe der 'FROM'-Anweisung zu verwenden. Wenn es jedoch in der Nähe der update-Anweisung verwendet wird, gibt es die gleiche Fehlermeldung wie die erste Anweisung

Die Sperrhinweise NOLOCK und READUNCOMMITTED sind für Zieltabellen von INSERT-, UPDATE- oder DELETE-Anweisungen nicht zulässig.

Vielen Dank

+3

Kein Unterschied in Ihrem spezifischen Beispiel. Die bisherigen Antworten erwähnen die Möglichkeiten von Joins. Sie sollten jedoch gewarnt werden, dass Joins gefährlich sein können - wenn das Ergebnis des Joins bedeutet, dass eine Zeile aus der Zieltabelle mit * multiple * Zeilen aus anderen Tabellen verbunden wurde und die Aktualisierung auf Werten aus den anderen Tabellen basiert, die Zeile (n) wird tatsächlich verwendet, um das Update durchzuführen ist nicht deterministisch. –

Antwort

3

Sie sind gleich.

Wenn die UPDATE-Anweisung nur den Zugriff auf eine einzelne Tabelle erfordert, ist die 1. sauberer/einfacher.

Wenn Sie z.B. ein JOIN, dann einen Alias ​​pro Ihr zweites Beispiel Zuweisen (IMO) Reiniger, wie:

UPDATE a 
SET a.Col = 1 
FROM TableA a 
    JOIN TableB b ON a.Id = b.Id 
WHERE b.Something = '123' 

BTW, gibt es keinen Punkt ein NOLOCK-Hinweis auf den Tisch Angabe aktualisiert werden, so zählen nicht, dass als Grund für einen über den anderen.

+0

+1 für (NOLOCK) in der UPDATED-Tabelle wird bei Aktualisierungen ignoriert (wird in verknüpften Tabellen berücksichtigt). sp_lock zeigt keinen Unterschied in SQL 2008. – StuartLC

3

Sie können die FROM-Syntax verwenden, wenn Sie benötigen oder wenn es sicher Aliase zu verwenden (wie in Ihrem Beispiel) oder JOIN wie dieses:

UPDATE a 
SET col = 1 
FROM table1 a 
INNER JOIN table2 b ON b.id = a.bid 
WHERE b.col = 'x' 
2

Eines der gemeinsamen Szenarien für die Verwendung von Methode 2 ist, wenn Sie basierend auf einem Filter für verbundene Tabellen aktualisieren müssen, z

UPDATE a 
SET a.col = 1 
FROM table1 a inner join table2 b on a.someFK = b.somePK 
WHERE a.col2 = 'xyz' and b.col3 = 'abc' 
1

Beide sind gut, aber es hängt davon ab, was Sie brauchen.

Das erste Beispiel ist einfacher, erlaubt jedoch nicht die Verwendung von Werten aus anderen Tabellen.

Beispiel 2 ist sehr nützlich, wenn Sie Werte aus anderen Tabellen verwenden müssen, um Ihre Tabelle zu aktualisieren, wie von Mulmoth demonstriert.

Verwandte Themen