2016-08-04 7 views
0

対セットに適用される私はランダム[アドレス]でのstateidを更新しようとしていたので、私はこのクエリ更新割り当てが行

update [address] 
set stateid = (select top 1 id 
       from lookupvalue 
       where lookuptypeid = 3 and code = 1 
       order by newid()), 
    countryid = 1 

select * 
from [address] 

で始めたが、それが表示されたとして、すべての行が同じ値を取得するには、ときに私内側のselectクエリから[address]テーブルを参照しようとしましたが、更新は1行ごとに実行されます(そして、私は必要な効果を得ました)。

update [address] 
set stateid = (select top 1 id 
       from lookupvalue 
       where lookuptypeid = 3 and [address].id = [address].id 
       and code = 1 
       order by newid()), 
    countryid = 1 

select * 
from [address] 

誰かが、私は、行ごとに評価されるアップデートの割り当てを強制的に内側の選択にダミーの参照を行う必要があります、それは計画を照会するために関連して、上記の動作について詳しく説明することはできますか?

答えて

1

コメントが長すぎます。

はい、クエリプランに関連しています。 SQL Server(およびその他のデータベースも)はサブクエリを参照し、最適化できないと判断します。 newid()は揮発性の関数なので、私はこれをエラーとみなしているため、サブクエリを最適化することはできません。しかし、反対側にも議論があります。

外部参照を貼ると問題が解決されるため、この「最適化」を回避する方法を知っています。

+0

上記を実行することをお勧めしますか?私は助けることはできませんが、これは明らかなコードよりも少ないと感じています。あなたのアップデートに参加することは、より論理的なアプローチのようですね。 – Jens

+0

@Jens。 。 。オプティマイザがある日よりスマートになり、相関節が不要であることに気づきます。 –

0

行ごとの結果を評価するには、CROSS APPLYを使用することもできます。