在使用相同的模式查询多个表时消除代码重复

时间:2012-01-12 05:09:46

标签: sql-server sql-server-2008

我继承了一些代码,这些代码使用多个表来存储相同的信息,具体取决于它的年龄(当天,上个月等)。

目前大多数代码都是针对每种情况重复的,我想尝试消除存储过程中的大部分重复。现在重新设计设计不是一种选择,因为有许多应用程序依赖于我无法控制的当前设计。

到目前为止我尝试过的一个选项是将所需的数据加载到临时表中,我发现它具有相当大的性能影响。我也试过使用像这样结构的cte:

;WITH cte_table(...) 
AS 
(
  SELECT ...
  FROM a
  WHERE @queried_date = CONVERT(DATE, GETDATE())

  UNION ALL

  SELECT ...
  FROM b
  WHERE @queried_date BETWEEN --some range
)

这种方法很有效,而且性能也不差,但看起来并不是很好看。

有人能提供更好的选择吗?

1 个答案:

答案 0 :(得分:1)

两个建议:

  1. 只需使用UNION,而不是UNION ALL。在这种情况下,UNION operator会删除重复项。 UNION ALL保留了欺骗行为。

  2. 使用CTE,外部/结尾的SELECT子句可以有一个DISTICT运算符来返回唯一的行。当然,不确定为什么你会在这种情况下使用CTE,因为UNION应该可以正常工作。 (事实上​​,我相信SQL会以任何方式优化查询到同一个计划结构......)

  3. 你切片的任何方式,如果你有重复的数据,要么你必须做上面的事情,要么你必须使用删除欺骗案件的显式条款,使用像#temp tables或WHERE ... NOT IN ()。