Sql 如何将CTE更改为视图
我在下面有一些代码,这是一个CTE在一个CTE中查看一个CTE中的视图。 我试图重新编码这个(不是我的代码),让一个视图看到一个视图,这样我就可以在不支持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
;
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代码>