【发布时间】:2010-09-22 03:05:11
【问题描述】:
我有一个事件表,我需要找到类型 1 的所有尾部事件和类型 1 的所有头部事件。
因此,对于按 [1, 1], 3, 1 ,4, 5, [1,1,1] 顺序排列的事件集,括号表示类型 1 的头事件和尾事件。
这在 SQL 中得到了更好的说明:
drop table #event
go
create table #event (group_id int, [date] datetime, [type] int)
create index idx1 on #event (group_id, date)
insert into #event values (1, '2000-01-01', 1)
insert into #event values (1, '2000-01-02', 1)
insert into #event values (1, '2000-01-03', 3)
insert into #event values (1, '2000-01-04', 2)
insert into #event values (1, '2000-01-05', 1)
insert into #event values (2, '2000-01-01', 2)
insert into #event values (2, '2000-01-02', 2)
insert into #event values (2, '2000-01-03', 3)
insert into #event values (2, '2000-01-04', 2)
insert into #event values (2, '2000-01-05', 1)
insert into #event values (3, '2000-01-01', 1)
insert into #event values (3, '2000-01-02', 2)
insert into #event values (3, '2000-01-03', 1)
insert into #event values (3, '2000-01-04', 2)
insert into #event values (3, '2000-01-05', 2)
insert into #event values (4, '2000-01-01', 2)
insert into #event values (4, '2000-01-02', 2)
insert into #event values (4, '2000-01-03', 3)
insert into #event values (4, '2000-01-04', 1)
insert into #event values (4, '2000-01-05', 1)
go
select e1.* from #event e1
where (
not exists (
select top 1 1
from #event e2
where e1.group_id = e2.group_id
and e2.date < e1.date
and e2.type <> 1
) or not exists (
select top 1 1
from #event e2
where e1.group_id = e2.group_id
and e2.date > e1.date
and e2.type <> 1
)
)
and e1.type = 1
预期结果:
1 2000-01-01 00:00:00.000 1
1 2000-01-02 00:00:00.000 1
1 2000-01-05 00:00:00.000 1
2 2000-01-05 00:00:00.000 1
3 2000-01-01 00:00:00.000 1
4 2000-01-04 00:00:00.000 1
4 2000-01-05 00:00:00.000 1
这一切都很好,并返回了我的预期结果,但它扫描了表格 3 次。有什么办法可以让这个执行得更快并减少表扫描的次数?
【问题讨论】:
-
完成,这是 sql 2005 但我也需要支持 2000