2011-07-27 11 views
2

これは実際にはまっすぐなようですが、これを正しく検証して確実に実行したいと考えています。結合された選択に基づいてSQLレコードを更新する

基本的に私は、これらのレコードのUPDATEを実行したい:

SELECT  contact.company, contact.coaddress, contact.costate, contact.cocity, contact.cozip, contact.phonebusiness, dial.AgentID, dial.Attempts, dial.CRC 
FROM   contact LEFT OUTER JOIN 
        dial ON contact.DialID = dial.DialID 
WHERE  (dial.AgentID > '-1') AND (contact.cozip LIKE '600%' OR 
        contact.cozip LIKE '601%' OR 
        contact.cozip LIKE '606%' OR 
        contact.cozip LIKE '608%' OR 
        contact.cozip LIKE '605%' OR 
        contact.cozip LIKE '604%' OR 
        contact.cozip LIKE '613%' OR 
        contact.cozip LIKE '611%') 

私はSELECTステートメントの私の正しい結果を取り戻します。私は今、それらのレコードを更新する必要があります。

UPDATE dial 
SET    ProjectID = '60' 
FROM   dial INNER JOIN 
        contact ON dial.DialID = contact.DialID 
WHERE  (dial.AgentID > '-1') AND (contact.cozip LIKE '600%' OR 
        contact.cozip LIKE '601%' OR 
        contact.cozip LIKE '606%' OR 
        contact.cozip LIKE '608%' OR 
        contact.cozip LIKE '605%' OR 
        contact.cozip LIKE '604%' OR 
        contact.cozip LIKE '613%' OR 
        contact.cozip LIKE '611%') 

はこれが正しい見ていますか?これを行うより効率的な方法はありますか?

+3

更新ステートメントをトランザクションに入れてテストします。上手く見えますが、最初にトランザクションの安全性をテストすることはできません。 – Andrew

答えて

4

はい、正しく表示されます。

好きなトリックがあり、個人的に別名が好きです。エイリアスdは、どのテーブルがJOIN内で更新されているかを明確にします。 [] LIKEで範囲を意味するかAGENTIDは数でなければなりません-1すぎ

UPDATE 
    d 
SET 
    ProjectID = '60' 
FROM 
    dial d 
    INNER JOIN 
    contact ON d.DialID = contact.DialID 
WHERE 
    (d.AgentID > -1) --edit, int. Not varchar 
    AND 
    (contact.cozip LIKE '60[016854]%' OR contact.cozip LIKE '61[13]%') 

を設定しますか?

+0

いいえ、AgentIDは0以上を含む必要があります.0未満の場合は条件に含まれません。 – RogueSpear00

+0

@gbnは、mssqlが 'または'と組み合わせたそれらのワイルドチャールズでインデックスを使用できるようになります。私はwildcharsを 'or'と組み合わせて使っていくつかの悪い経験をしましたか? –

+0

@ t-clausen.dk:たぶん、そうではないかもしれません... LEFTは間違いなくインデックスを使用しません。 – gbn

1

これは、JOINに基づいて削除または更新の正しい構文のようです。

サブクエリとIN演算子を交互に使用できます(例: "UPDATEダイヤルSET ProjectID = '60'どこのDialIDで(ダイヤルからのSELECT DialID ...)"。

関連する問題