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


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

どちらが優先されますか?これらの2つの単純なSQL Update文には違いがありますか?

私が知ることができる1つの違いは、2番目のステートメントが 'FROM'ステートメントの近くにWITH NO LOCKを使用できることでした。しかし、更新ステートメントの近くで使用すると、最初のステートメントと同じエラーメッセージが返されます。

INSERT、UPDATE、またはDELETEステートメントのターゲットテーブルでは、NOLOCKおよびREADUNCOMMITTEDロックヒントは許可されません。

本当にありがとうございました

+3

具体的な例で違いはありません。これまでの回答では、結合の可能性について言及しています。ただし、結合の結果が、ターゲット表の行が他の表の*複数行に結合され、更新が他の表の値に基づいていることを意味する場合、結合は危険である可能性があることを警告する必要があります。実際に更新を実行するために使用される行は決定的ではありません。 –

答えて

3

これらは同じです。

UPDATEステートメントが1つのテーブルにしかアクセスしない場合、1番目のテーブルはよりクリーンでシンプルです。

A JOINを、その後、あなたの第二の例の別名を割り当てること(IMO)クリーナーである、のような:

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

ところで、そこにはポイント更新されているテーブルの上にNOLOCKヒントを指定するにはされていない、ようにそれはカウントされません。もう一方の理由。

+0

UPDATEDテーブルの(NOLOCK)+1は更新時に無視されます(結合テーブルに適用されます)。 sp_lockはSQL 2008の違いを示していません。 – StuartLC

3

それは(あなたの例のように)エイリアスを使用する自信がありますか、このいずれかのように参加した場合、あなたが必要がある場合、あるいは構文と使用することができます。共通の

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

ワン方法2を使用するシナリオは、結合された表のフィルターに基づいて更新する必要がある場合です。

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

どちらも良いですが、必要なものによって異なります。

最初の例は単純ですが、他のテーブルの値を使用することはできません。

例2は、Mulmothが示すように、テーブルを更新できるように他のテーブルの値を使用する必要がある場合に非常に便利です。

関連する問題