【发布时间】:2015-02-06 14:39:59
【问题描述】:
我正在尝试解决我现在维护的大量数据库存储过程,但我遇到了一个令人困惑的问题。我不知道它是否包含冗余/无用代码,或者我是否缺少一些细微差别,因为我仍然只是 SQL 语言的中级。这是有问题的代码部分:
UPDATE #NewValues
SET ValidNumber = CASE WHEN SP.ModelNumber IS NULL THEN 0
ELSE 1
END
FROM #NewValues NV
LEFT OUTER JOIN Stage.Products SP
ON NV.SKU = SP.SKU
AND (NV.ModelNumber = SP.ModelNumber OR NV.UPC = SP.ModelNumber)
WHERE NV.SKU IN (
SELECT NV.SKU
FROM #NewValues NV
INNER JOIN Stage.Products SP
ON NV.SKU = SP.SKU
AND (NV.ModelNumber = SP.ModelNumber OR NV.UPC = SP.ModelNumber)
WHERE NV.ValidNumber = 1
)
在我看来,SP.ModelNumber 不会为 NULL,因为嵌套的 SELECT 语句永远不会返回带有 SP.ModelNumber NULL 结果的 SKU。所以唯一能做的就是SET ValidNumber = 1。那是对的吗?同样,我不确定这里是否还有其他事情我无法将其纳入逻辑,但似乎嵌套的 SELECT 语句将是您实现相同目标所需的全部内容结果。由于此代码位于更大的查询中的方式,我很难尝试建立一个与正常使用相匹配的情况来测试它,特别是因为我不确定ValidNumber 值是什么将是在这部分代码运行之前。
【问题讨论】:
-
这就是我们所说的“白痴证明”。您可能会惊讶于人们会以最意想不到的方式输入数据。作为后端开发人员,我们必须考虑人们输入数据的所有可能的愚蠢方式(无意冒犯)。开个小玩笑:您是否见过吹风机上的警告标签:不要在淋浴时使用它?
-
仅仅因为至少一个 sku 有一个有效的 modelNumber 并不意味着所有这些 sku 都有有效的 modelNumbers
标签: sql sql-server tsql sql-server-2005 case