仅当特定列中不存在值时才更新表

时间:2017-03-16 10:18:08

标签: sql sql-server sql-server-2008

enter image description here我想仅在

时更新表(myTable)中的列(variableA)
  1. 变量A列
  2. 中没有此变量的变量数据集
  3. 变量B列中已存在@variableB的数据集,变量A列中的数据为“DUMMY”
  4. 仅供参考:另一个界面之前插入'DUMMY'数据集,之后我需要用真实变量/数字更新它们。

    下面的代码已经正常工作但我想知道是否有一个更“优雅”的解决方案来做到这一点。我想避免/更改最后一行(“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 个答案:

答案 0 :(得分:2)

你可以像这样使用not exists operator

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

如果它再次变慢,你可以通过variableA列设置索引I_my_Table_variableA,它会更快(你可以按变量设置索引,因为它几乎是唯一的,它将是很好的索引)

答案 1 :(得分: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而不指定ORDER BY是错误的,因为数据库表本质上是未排序的,这实际上意味着您可能会得到意外的结果。

其次,将(select count) > 0更改为exists(select...)可能会提高性能(除非优化程序足够聪明,可以在两种情况下使用相同的执行计划)

此外,对于您将来的问题 - 避免使用图片向我们展示示例数据和所需结果。使用DDL + DML显示样本数据,使用文本显示所需结果。如果您这样做,我们可以将您的样本数据复制到测试环境,并在发布之前对其进行实际测试。