Sql 如何将CTE更改为视图

Sql 如何将CTE更改为视图,sql,sql-server,Sql,Sql Server,我在下面有一些代码,这是一个CTE在一个CTE中查看一个CTE中的视图。 我试图重新编码这个(不是我的代码),让一个视图看到一个视图,这样我就可以在不支持CTE的应用程序中使用 ; WITH C1 AS ( SELECT CTenancyPK,CdblRentalAmount, ts, Type ,e=CASE Type WHEN 1 THEN NULL ELSE ROW_NUMBER() OVER (PARTITION BY CTenancyPK

我在下面有一些代码,这是一个CTE在一个CTE中查看一个CTE中的视图。 我试图重新编码这个(不是我的代码),让一个视图看到一个视图,这样我就可以在不支持CTE的应用程序中使用

    ;
WITH C1 AS (
        SELECT CTenancyPK,CdblRentalAmount, ts, Type
            ,e=CASE Type WHEN 1 THEN NULL ELSE ROW_NUMBER() OVER (PARTITION BY CTenancyPK, Type ORDER BY LTOdteVacatingDate) END
            ,s=CASE Type WHEN -1 THEN NULL ELSE ROW_NUMBER() OVER (PARTITION BY CTenancyPK, Type ORDER BY LTOdteOccupiedDate) END
            ,se=ROW_NUMBER() OVER (PARTITION BY CTenancyPK ORDER BY ts, Type DESC)
        FROM dav.LTOwCompany
        CROSS APPLY (
            VALUES (1, LTOdteOccupiedDate), (-1, LTOdteVacatingDate)) a(Type, ts)
        ),

    C3 AS (
        SELECT CTenancyPK,CdblRentalAmount, ts
            ,grpnm=FLOOR((ROW_NUMBER() OVER (PARTITION BY CTenancyPK ORDER BY ts)-1) / 2 + 1)
        FROM C1
        WHERE COALESCE(s-(se-s)-1, (se-e)-e) = 0),
    -- C1, C2, C3, C4 combined remove the overlapping date periods
    C4 AS (
        SELECT CTenancyPK,CdblRentalAmount, datestart=MIN(ts), dateend=MAX(ts)
        FROM C3
        GROUP BY CTenancyPK, grpnm, CdblRentalAmount)


SELECT qryAddress.Address, CTenancyPK, VoidDateStart=MIN(newdate), VoidDateEnd=MAX(newdate),CdblRentalAmount,VoidCost = (CdblRentalAmount * 12 / 365) * case when '2018-04-01' between MIN(newdate) and MAX(newdate) then  datediff(dd,'2018-04-01',MAX(newdate)+1)
else datediff(dd,MIN(newdate),MAX(newdate)+1)
end ,
case when '2018-04-01' between MIN(newdate) and MAX(newdate) then  datediff(dd,'2018-04-01',MAX(newdate)+1)
else datediff(dd,MIN(newdate),MAX(newdate)+1)
end as NoDays

FROM (
    SELECT CTenancyPK,CdblRentalAmount, newdate
        ,rn=ROW_NUMBER() OVER (PARTITION BY CTenancyPK ORDER BY newdate) / 2
    FROM C4 a
    CROSS APPLY (
        VALUES (datestart-1),(dateend+1)) b(newdate)
    ) a
Join Tenancy on Tenancy.TenancyPK = CTenancyPK
Join Property on Property.PropertyPK = Tenancy.PropertyFK
Join qryAddress on qryAddress.AddressPK = Property.AddressFK

GROUP BY Address,CTenancyPK, rn, CdblRentalAmount
HAVING COUNT(*) = 2 and MAX(newdate) >= '2018-04-01' 
ORDER BY CTenancyPK, Voiddatestart; 
我想看看是这样的

SELECT qryAddress.Address, CTenancyPK, VoidDateStart=MIN(newdate), VoidDateEnd=MAX(newdate),CdblRentalAmount,VoidCost = (CdblRentalAmount * 12 / 365) * case when '2018-04-01' between MIN(newdate) and MAX(newdate) then  datediff(dd,'2018-04-01',MAX(newdate)+1)
else datediff(dd,MIN(newdate),MAX(newdate)+1)
end ,
case when '2018-04-01' between MIN(newdate) and MAX(newdate) then  datediff(dd,'2018-04-01',MAX(newdate)+1)
else datediff(dd,MIN(newdate),MAX(newdate)+1)
end as NoDays

FROM Dav.LTOvLTO 
-- New view that dose the CTE calculation and looks at Dav.LTOwCompany

Join Tenancy on Tenancy.TenancyPK = CTenancyPK
Join Property on Property.PropertyPK = Tenancy.PropertyFK
Join qryAddress on qryAddress.AddressPK = Property.AddressFK
GROUP BY Address,CTenancyPK, rn, CdblRentalAmount
HAVING COUNT(*) = 2 and MAX(newdate) >= '2018-04-01' 
ORDER BY CTenancyPK, Voiddatestart; 

您可以将CTE与视图一起使用:

CREATE VIEW v AS
WITH C1 AS (
        SELECT CTenancyPK,CdblRentalAmount, ts, Type
            ,e=CASE Type WHEN 1 THEN NULL ELSE ROW_NUMBER() OVER (PARTITION BY CTenancyPK, Type ORDER BY LTOdteVacatingDate) END
            ,s=CASE Type WHEN -1 THEN NULL ELSE ROW_NUMBER() OVER (PARTITION BY CTenancyPK, Type ORDER BY LTOdteOccupiedDate) END
            ,se=ROW_NUMBER() OVER (PARTITION BY CTenancyPK ORDER BY ts, Type DESC)
        FROM dav.LTOwCompany
        CROSS APPLY (
            VALUES (1, LTOdteOccupiedDate), (-1, LTOdteVacatingDate)) a(Type, ts)
        ),

    C3 AS (
        SELECT CTenancyPK,CdblRentalAmount, ts
            ,grpnm=FLOOR((ROW_NUMBER() OVER (PARTITION BY CTenancyPK ORDER BY ts)-1) / 2 + 1)
        FROM C1
        WHERE COALESCE(s-(se-s)-1, (se-e)-e) = 0),
    -- C1, C2, C3, C4 combined remove the overlapping date periods
    C4 AS (
        SELECT CTenancyPK,CdblRentalAmount, datestart=MIN(ts), dateend=MAX(ts)
        FROM C3
        GROUP BY CTenancyPK, grpnm, CdblRentalAmount)
    SELECT *
    FROM c4;

不支持CTE的应用程序
这意味着什么?这只是一个SQL查询。任何应用程序都将按原样执行它。您是否正在尝试使用ORM或报告工具生成与CTE等效的内容?您不希望创建一个查看其他视图的视图。这就是所谓的嵌套视图,它会削弱代码的性能。应用程序读取sql,但它的方式非常严格,它不运行CTE,如果你想了解更多有关应用程序的信息,可以说,但我认为这不是问题所在point@JD_123应用程序不运行查询,服务器运行。这就是问题所在——为什么你不能首先使用CTE?为什么不创建一个使用CTE的视图呢?这个问题已经写得满满的。我没有权限创建这样的视图,我必须在其中使用对象资源管理器来创建视图SSMS@JD_123SSMS对象资源管理器不创建视图。查询设计器生成查询字符串。如果您可以使用查询设计器创建视图,那么在使用create view code时,您只需自己编写
create view
语句即可。“不正确的语句”create view“必须是批处理中的唯一语句”正确的语法是
create view v AS WITH c1(…)SELECT*FROM c4