0

私はSQLServerを使用していますが、以下のクエリで懸念があります。リスト内の場所を実行すると、左側のフィールドが右側のフィールド(同じテーブルからのもの)で更新されるかどうかはわかりません。

update loc 
set locShortName = locName 
where locid in (3,4,11,13,14,15,16,18,19,20,21,24,32,41,45,68,69,77,82,85)

update loc set locShortName = locName where locid = 3 (move to next record in the list)      
update loc set locShortName = locName where locid = 4 (move to next record in the list)
update loc set locShortName = locName where locid = 11(move to next record in the list)

等々...

リストの最初の番号を取り、フィールド値の設定に対処してから、リストの次の番号に移動すると思います。

私の期待は正しいですか?

前もって感謝します。

4

4 に答える 4

2

それは私には正しいように見えます。このような1回限りの更新クエリを作成するときは常に、最初にテーブルのコピーでテストします。

于 2012-10-31T18:47:37.607 に答える
0
update loc set locShortName = locName where locid in 
(3,4,11,13,14,15,16,18,19,20,21,24,32,41,45,68,69,77,82,85)

あなたはそれがこのように機能すると考えることができます:

行を取ります。locidがリストにある場合は、その行のlocNameを取得し、locShortNameに配置します。

別の行を取ります。locidがリストにある場合は、その行のlocNameを取得し、locShortNameに配置します。

別の行を取ります。locidがリストにない場合、何もしません。

等々

一度に1つずつ処理するわけではありませんが、コンセプトの結果は次のようになります。

于 2012-10-31T18:47:37.110 に答える
0

あなたの期待はほぼ正しいです。一度に 1 つのレコードを処理するのではなく、レコードのセット全体を処理します。locid = ... であるレコードを取得し、locShortname フィールドを各レコードの locname フィールドに一気に更新します。SQl コードを記述するときは、個々のレコードを処理するという観点から考えるべきではなく、一連のレコードを処理するという観点だけを考えるべきです。

于 2012-10-31T18:54:15.827 に答える
0

前の 2 つの回答は間違っていません。単一の暗黙的なトランザクション (クエリで開始および終了) 内のすべてのレコードを読み取り、更新します。クエリの更新部分は、同じレコードから「locShortName」と「locName」の値をマップします。

何が更新されるかを知る最も簡単な方法は、次のように更新クエリを作成することです。完了したら、通常、副作用の構文を削除します。

--update l
--set locShortName = locName 
select locShortName = locName
from loc as l
where locid in (3,4,11,13,14,15,16,18,19,20,21,24,32,41,45,68,69,77,82,85);

私が言ったように、終了したら、選択行を削除して更新/設定行のコメントを外すか、副作用のある構文を削除します。この形式は、他のテーブルにも結合する場合に役立ちます。

selectステートメントを変更するたびに、対応する変更をupdateステートメントに加えてください(コメントされていても)。

クエリの結果が不明な場合のもう 1 つの良い方法は、トランザクションを開始して、結果の変更と行数を確認できるようにすることです。その後、必要に応じてトランザクションをコミットまたはロールバックできます。これらの行またはテーブルのいずれかでロックを保持するため、アクティブなシステムに長く留まらないように警告します。

于 2012-10-31T18:57:40.897 に答える