【发布时间】:2016-06-08 12:08:25
【问题描述】:
我使用的是 SQL Server 2012。我有一个查询,它将查看给定月份并通过检查该成员在给定月份的注册跨度来确定哪些成员在该月份处于活动/有效状态。查询如下所示:
select monthstart, monthend
into #tmp
from monthtable --This table contains the month start and end dates I need
create table #result(ID varchar(20), monthstart varchar(8))
declare @eff varchar(8)
declare @end varchar(8)
while (select count(*) from #tmp) > 0
begin
select top 1 @eff = monthstart from #tmp order by monthstart
select top 1 @end = monthend from #tmp order by monthstart
insert into #result
select ID, @eff
from members
where ymdeff <= @end and ymdend >= @eff -- Ensures the member is active for at least one day in this month
end
select * from #result
我正在寻找一组大约 50 名成员,为期大约 8 个月。自从我开始写这篇文章以来,这个查询就一直在运行,而且还在继续。我认为它最终会得到正确的答案,但它需要的时间太长了。这似乎应该很简单,但我想不出任何其他方法来做到这一点,除了写出每个月的 where 语句,或者使用仍然是迭代而不是基于集合的动态 sql。有什么方法可以让我更快地完成这项工作?
感谢您的帮助!
【问题讨论】:
-
我认为这个循环是无限的......你没有从#tmp删除数据
-
像下面
select m.ID, t.eff from members m , #tmp t where m.ymdeff <= t.monthstart and m.ymdend >= t.monthend这样创建连接怎么样 -
为什么不在这里忘记循环并将其作为单个插入语句执行?
标签: sql sql-server while-loop