Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以使用WITH子句或其他更好的CTE重新编写此SQL查询?_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

有没有一种方法可以使用WITH子句或其他更好的CTE重新编写此SQL查询?

有没有一种方法可以使用WITH子句或其他更好的CTE重新编写此SQL查询?,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,正如您在下面所看到的,在另一个SQL查询的内部有一个SQL查询。我有没有办法给这些查询一个别名,并在继续的查询中调用该别名,而不是完全重写它?我试图使用WITH子句来完成这项工作,但最终出现了无数错误,我似乎无法避免。任何不必重新编写查询就可以减少这种情况的方法都是我想要的。顺便说一下,我正在使用MicrosoftSQLServer2005 select MNumber, CDate, (select MAX(CDate) from tbl_MeterCalib MC2 WHERE MC

正如您在下面所看到的,在另一个SQL查询的内部有一个SQL查询。我有没有办法给这些查询一个别名,并在继续的查询中调用该别名,而不是完全重写它?我试图使用WITH子句来完成这项工作,但最终出现了无数错误,我似乎无法避免。任何不必重新编写查询就可以减少这种情况的方法都是我想要的。顺便说一下,我正在使用MicrosoftSQLServer2005

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

任何帮助都将不胜感激!谢谢大家!

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

但是,可以对派生表使用交叉应用来消除重复:

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;