有没有办法使用WITH子句或任何其他可能更好的CTE重写此SQL查询?

时间:2015-06-18 04:21:30

标签: sql sql-server sql-server-2005

如下所示,在另一个SQL查询中的SQL查询中有一个SQL查询。有没有什么办法可以给这些查询一个别名,并在前面的查询中调用该别名而不是完全重写它?我试图使用WITH子句来做这件事,但结果却出现了无数的错误,我似乎无法解决这些问题。任何可能的方法来减少这一点而不必重新编写查询几乎是我正在寻找的。我顺便使用Microsoft SQL Server 2005。

select 
MNumber, 
CDate,
(select MAX(CDate) 
from tbl_MeterCalib MC2 
WHERE MC2.MNumber= MC1.MNumber
AND CDate< MC1.CDate) as PrevCalDate,

datediff(d,(select MAX(CDate) 
from tbl_MeterCalib MC2 
WHERE MC2.MNumber= MC1.MNumber
AND CDate< MC1.CDate),CDate)/2 as AdjPeriod,

dateadd(d, -datediff(d,(select MAX(CDate) 
from tbl_MeterCalib MC2 
WHERE MC2.MNumber= MC1.MNumber
AND CDate< MC1.CDate),CDate)/2,CDate) as DaysBackTo

from tbl_MeterCalib MC1

任何帮助将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:2)

您将无法使用CTE,因为重复选择取决于与当前行相关的过滤器。

但是,您可以对派生表使用CROSS APPLY来干掉重复:

select 
    MNumber, 
    CDate,
    x.MaxCDate as PrevCalDate,
    datediff(d,x.MaxCDate,CDate)/2 as AdjPeriod,
    dateadd(d, -datediff(d,x.MaxCDate,CDate)/2,CDate) as DaysBackTo
from tbl_MeterCalib MC1
    CROSS APPLY 
    (
        select MAX(CDate) AS MaxCDate
        from tbl_MeterCalib MC2 
        WHERE MC2.MNumber= MC1.MNumber
            AND CDate< MC1.CDate
    ) x;

SqlFiddle