2015-02-06 30 views
0

我在UPDATE语句中找到了下面的WHERE子句,我讨厌它。我认为唯一能让它与众不同的方法是与CTE和一些联盟。更新中令人讨厌的WHERE子句

FROM dbo.Table1 T1  
INNER JOIN #Table2 T2 ON T1.IntField1 = T2.IntField1 
WHERE (ISNULL(T1.IntField2, 0) <> ISNULL(T2.IntField2, 0) 
    OR ISNULL(T1.IntField3, 0) <> ISNULL(T2.IntField3, 0)) 
    AND (T2.IntField1 IN (
     SELECT IntField1 
     FROM dbo.Table3) 
     OR T2.IntField1 IS NULL) 

我想我只是盯着这太久了。我碰巧看到这个SP,看到这个。真的觉得有些事情可以做得不同/更好。

回答

1

这不是最漂亮的不,但并不需要改变它,除非它表现糟糕。不要因为你不喜欢它的外观而改变SQL代码,这往往会适得其反,因为一些最糟糕的代码是最高性能的代码,DBA不会感谢你改变他们的调整代码。认为你应该改变SQL代码以适合你的个人偏好是你需要打破的坏习惯。请阅读有关性能调整的内容,然后重构以提高性能,以便不符合您对漂亮或(更加优雅!)代码的偏见。

有两件事我可以看到,但可能会有所帮助。首先,你为什么需要OR T2.IntField1 IS NULL?由于您正在加入对该字段的table1的内连接,因此永远不会有T2.IntField1为NULL的结果集。

另一件事取决于#table2用于什么。但是,由于您明确地创建并填充了此表,为什么不在将数据放入表时将T2.IntField2和T2.IntField3转换为0时为空?这会降低更新查询的复杂度。但是,如果您在此过程中需要这些空值作为其他用途,则无法执行此操作。

0

看起来你可以结合where子句的元素融入加入:

概述:

1)NOT(A和B)相同,NOT(A)OR NOT(B)

2)IN或NULL可以组合成一个ISNULL()连接。

FROM dbo.Table1 T1  
    JOIN #Table2 T2 ON T1.IntField1 = T2.IntField1 
     AND NOT 
     (
      ISNULL(T1.IntField2, 0) = ISNULL(T2.IntField2, 0) 
      and 
      ISNULL(T1.IntField3, 0) = ISNULL(T2.IntField3, 0) 
     ) 
    JOIN dbo.Table3 t3 on 
     t3.IntField1 = ISNULL(T2.IntField1, t3.IntField1) 

但正如之前所说,如果性能是唯一的重点,这虽然更可读(在我看来)是没有必要的。