2011-07-27 106 views
2

這看起來非常簡單,我想我只是想驗證並確保我正確地做到了這一點。根據加入的選擇更新SQL記錄

基本上我想對這些記錄運行的更新:

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

將update語句放入事務中並對其進行測試。看起來不錯,但沒有什麼能阻止你首先進行交易安全測試。 – Andrew

回答

4

是的,這看起來是正確的。

有一些LIKE技巧,我個人喜歡別名。別名d可以明確在JOIN中更新哪個表。在[]中的類似裝置的範圍內或設置

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]%') 

是否應AGENTID是數目-1嗎?

+0

不,AgentID應該包含0及以上,低於0的任何東西都不是標準的一部分。 – RogueSpear00

+0

@gbn mssql能夠將這些通配符與'或'組合使用索引。我有一些使用wildchars與'或'結合的不好體驗? –

+0

@ t-clausen.dk:也許,也許不是......你的LEFT絕對不會使用索引。 – gbn

1

對於基於JOIN的刪除或更新,這看起來像正確的語法。

請注意,您可以交替使用子查詢和IN運算符,例如, 「更新撥號SET項目ID ='60'其中DialID in(從選擇撥號撥號...)」。