2017-03-16 36 views
1

enter image description here我想在一個表(mytable的)來更新一列(variableA的),只有當更新表

  1. 沒有與此@variableA在variableA的沒有數據集已經有與在variableA的列

僅供參考@variableB在variableB的柱,並用「虛擬」的數據集列

  • :另一個接口插入「虛擬」數據集之前,我以後需要對其進行更新真實的變數/數字。

    下面的代碼已經正常工作,但我想知道是否有一個更「優雅」的解決方案來做到這一點。我想避免/更改的最後一行(「SELECT COUNT(*)」等)

    DECLARE @variableA nvarchar(10) = '12345' 
    DECLARE @variableB nvarchar(10) = '67890' 
    
    UPDATE TOP (1) myTable 
    SET variableA = @variableA, 
        timestamp = GETDATE() 
    WHERE variableB = @variableB 
    AND variableA = 'DUMMY' 
    AND (SELECT COUNT(*) FROM myTable WHERE variableA = @variableA) = 0 
    

    能否請你幫我找到一個更聰明的解決方案,而不是最後一行?

  • +2

    樣本數據和期望的結果將有助於解釋你想要做什麼。例如,哪個*行*得到更新? –

    +1

    感謝您的意見。我添加了示例數據的屏幕截圖。希望這可以幫助! – Malawirel

    回答

    1

    嗯,我會寫這樣的:

    UPDATE myTable 
    SET variableA = @variableA, 
        timestamp = GETDATE() 
    WHERE variableB = @variableB 
    AND variableA = 'DUMMY' 
    AND NOT EXISTS (
        SELECT 1 
        FROM myTable 
        WHERE variableA = @variableA 
    ) 
    

    首先,使用TOP沒有specifing ORDER BY是一個錯誤,因爲數據庫表是由自然不排序,這實際上意味着,你可能會得到意想不到的效果。

    其次,改變(select count) > 0exists(select...)可能會提高性能(除非優化器是足夠聰明,使用相同的執行計劃,對於兩種情況)

    此外,爲你的未來的問題 - 避免使用圖片來展示我們採樣數據和預期結果。使用DDL + DML顯示樣本數據,並使用文本顯示期望的結果。如果您這樣做,我們可以將您的示例數據複製到測試環境,並在發佈之前真實地測試答案。

    +0

    非常感謝!這看起來好多了!我將繼續關注DDL + DML的建議。 – Malawirel

    +0

    [很高興幫助: - )](http://meta.stackoverflow.com/questions/291325/how-to-show-appreciation-to-a-user-on-stackoverflow/291327#291327) –

    2

    可以將不存在運營商這樣

    not exists (SELECT 1 FROM myTable WHERE variableA = @variableA) 
    

    ,如果再耽誤你可以通過你的variableA的列設置索引I_my_Table_variableA,它會來得更快(您可以通過設置變量指標,因爲它幾乎是獨一無二的這將是很好的指數)