仅供参考:另一个界面之前插入'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
请您帮我找一个更智能的解决方案,而不是最后一行?
答案 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显示样本数据,使用文本显示所需结果。如果您这样做,我们可以将您的样本数据复制到测试环境,并在发布之前对其进行实际测试。