gpt4 book ai didi

sql - 使用with vs声明临时表: performance/difference?

转载 作者:行者123 更新时间:2023-12-03 14:35:00 24 4
gpt4 key购买 nike

我在 中创建了一个 sql 函数SQLServer 2008 声明了一个临时表并使用它来计算内部值的移动平均值

declare @tempTable table 
(
GeogType nvarchar(5),
GeogValue nvarchar(7),
dtAdmission date,
timeInterval int,
fromTime nvarchar(5),
toTime nvarchar(5),
EDSyndromeID tinyint,
nVisits int
)
insert @tempTable select * from aces.dbo.fEDVisitCounts(@geogType, @hospID,DATEADD(DD,-@windowDays + 1,@fromDate),
@toDate,@minAge,@maxAge,@gender,@nIntervalsPerDay, @nSyndromeID)


INSERT @table (dtAdmission,EDSyndromeID, MovingAvg)
SELECT list.dtadmission
, @nSyndromeID
, AVG(data.nVisits) as MovingAvg
from @tempTable as list
inner join @tempTable as data
ON list.dtAdmission between data.dtAdmission and DATEADD(DD,@windowDays - 1,data.dtAdmission)
where list.dtAdmission >= @fromDate
GROUP BY list.dtAdmission

但我也发现你可以像这样声明 tempTable:
with tempTable as 
(
select * from aces.dbo.fEDVisitCounts('ALL', null,DATEADD(DD,-7,'01-09-2010'),
'04-09-2010',0,130,null,1, 0)
)

问题:这两种方法有重大区别吗?一个比另一个更快或更常见/标准? 我认为声明会更快,因为您定义了您要查找的列是什么。如果我省略移动平均线计算中未使用的列,它会更快吗?(不确定这个因为无论如何它都必须获取所有行,尽管选择更少的列具有直观的意义,它会更快/更少)

我还找到了 create temporary table @table从这里 How to declare Internal table in MySQL?但我不希望表在函数之外持续存在(我不确定创建临时表是否这样做。)

最佳答案

除了马丁回答的

;with tempTable as 
(
select * from aces.dbo.fEDVisitCounts('ALL', null,DATEADD(DD,-7,'01-09-2010'),
'04-09-2010',0,130,null,1, 0)
)

SELECT * FROM tempTable

也可以这样写
SELECT * FROM 
(
select * from aces.dbo.fEDVisitCounts('ALL', null,DATEADD(DD,-7,'01-09-2010'),
'04-09-2010',0,130,null,1, 0)
) AS tempTable --now you can join here with other tables

关于sql - 使用with vs声明临时表: performance/difference?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5435319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com