T-SQL VIEW - CTE + UNPIVOT与UNIONs相比其他技术

时间:2012-08-08 13:53:53

标签: tsql view union common-table-expression unpivot

我想知道哪种解决方案更好。我必须在视图中声明一些变量,这些变量是使用T-SQL日期函数(DATEADD,DATEPART,GETDATE()等)计算的。

经过一些研究后我写了这个:

WITH DatePeriods(ThisWeek,LastWeek,MonthToDate,QuarterToDate,YearToDate) AS
(
    SELECT  "...date functions..." AS ThisWeek
            "...date functions..." AS LastWeek
            "...date functions..." AS MonthToDate
            "...date functions..." AS QuarterToDate
            "...date functions..." AS YearToDate
)
SELECT Desciption,Value
FROM DatePeriods
UNPIVOT
(
    Value FOR Desciption IN (ThisWeek,LastWeek,MonthToDate,QuarterToDate,YearToDate)
) AS Source

它看起来很酷,因为我有“cte”和“unpivot”。如果我想添加其他日期变量,我只应在CTE的select中插入。

另一种解决方案是使用普通的“联盟”:

SELECT  'ThisWeek',"...date functions..." AS ThisWeek
UNION
SELECT  'LastWeek',"...date functions..." AS LastWeek
UNION
SELECT  'MonthToDate',"...date functions..." AS MonthToDate
UNION
SELECT  'QuarterToDate',"...date functions..." AS QuarterToDate
UNION
SELECT  'YearToDate',"...date functions..." AS YearToDate

我认为这不太好,因为一个新的日期变量意味着新的联合,但只是在几个变量之间的联合之后。

有谁能告诉我哪种技术在这种情况下是好的做法,甚至提供其他解决方案?

提前致谢。

编辑:

这是我想要的输出:

Desciption      Value
ThisWeek        2012-08-05 08:55:23.013
LastWeek        2012-07-29 08:55:23.013
MonthToDate     2012-07-08 08:55:23.013
QuarterToDate   2012-05-08 08:55:23.013
YearToDate      2011-08-08 08:55:23.013

1 个答案:

答案 0 :(得分:4)

如果查看了查询计划,您会发现union版本的费用远高于unpivot版本。但是,如果您更改为union all,则会优于unpivot

如果您使用的是SQL Server 2008或更高版本,则可以使用values,而根据执行计划,费用与union all相同。

值版本:

select Description, Value
from (values ('ThisWeek',      getdate()+1),
             ('LastWeek',      getdate()+2),
             ('MonthToDate',   getdate()+3),
             ('QuarterToDate', getdate()+4),
             ('YearToDate',    getdate()+5)
     ) as T(Description, Value)

联盟所有版本:

SELECT  'ThisWeek' AS Description, getdate()+1 AS Value
UNION ALL
SELECT  'LastWeek', getdate()+2
UNION ALL
SELECT  'MonthToDate', getdate()+3 
UNION ALL
SELECT  'QuarterToDate', getdate()+4 
UNION ALL
SELECT  'YearToDate', getdate()+5

union慢于union all的原因是因为它试图从结果集中删除重复项,其中union all包含所有行而不考虑值。

相关问题