如下所示,在另一个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
任何帮助将不胜感激!谢谢!
答案 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;