我继承了一些代码,这些代码使用多个表来存储相同的信息,具体取决于它的年龄(当天,上个月等)。
目前大多数代码都是针对每种情况重复的,我想尝试消除存储过程中的大部分重复。现在重新设计设计不是一种选择,因为有许多应用程序依赖于我无法控制的当前设计。
到目前为止我尝试过的一个选项是将所需的数据加载到临时表中,我发现它具有相当大的性能影响。我也试过使用像这样结构的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
)
这种方法很有效,而且性能也不差,但看起来并不是很好看。
有人能提供更好的选择吗?
答案 0 :(得分:1)
两个建议:
只需使用UNION
,而不是UNION ALL
。在这种情况下,UNION operator会删除重复项。 UNION ALL
保留了欺骗行为。
使用CTE,外部/结尾的SELECT
子句可以有一个DISTICT
运算符来返回唯一的行。当然,不确定为什么你会在这种情况下使用CTE,因为UNION应该可以正常工作。 (事实上,我相信SQL会以任何方式优化查询到同一个计划结构......)
你切片的任何方式,如果你有重复的数据,要么你必须做上面的事情,要么你必须使用删除欺骗案件的显式条款,使用像#temp tables或WHERE ... NOT IN ()。