if object_id('[ta]') is not null drop table [ta]
create table [ta] ([ID] int,[Time] datetime)
insert into [ta]
select 1,'2013-06-24 14:08:43.000' union all
select 1,'2013-06-24 14:09:43.000' union all
select 1,'2013-06-24 14:10:43.000' union all
select 1,'2013-06-24 14:11:43.000' union all
select 1,'2013-06-24 14:16:43.000' union all
select 1,'2013-06-24 14:21:43.000' union all
select 1,'2013-06-24 14:26:43.000' union all
select 1,'2013-06-24 14:31:43.000'
select * from ta
;with wang as
(select rowid=ROW_NUMBER() over(order by getdate()),* from ta)
select * from wang s
where not exists (select 1 from wang t where ID=s.ID and DATEDIFF(ss,s.Time,t.time) between 0 and 300 and rowid>s.rowid)
------解决方案--------------------
我是分开判断啊,,,
首先你要明确一点exists的本质是使用inner join获得结果集来限制主表输出
也就是说我们可以把你的脚本看做一个表自己和自己inner join后的输出结果。
如果你理解了这一点。那么你exists内部语句的where中所有条件你可以看做inner join 的on内容
若一个inner join的on中有多个条件怎么处理?自然就是必须多个条件都满足才能正常输出
你看下面脚本
;with wang as
(
select rowid=ROW_NUMBER() over(order by getdate()),* from ta
),wang1 as
(
select top 1 * from wang where rowid=1
)
----select * from wang1 -- only rowid=1
select S.* from wang1 s ,wang t
where t.ID=s.ID and DATEDIFF(ss,s.Time,t.time) between 0 and 300 and t.rowid>s.rowid
这个就是仅考虑你主表S表中仅有第一行的情况,你可以尝试一次更变我的wang1中的where条件,你可就可以看到仅当rowid=8是 查询语句不返回结果,自然你的not exists也就仅会返回rowid=8了。
(注意not exists是指这个inner join查询结果集中没有的行)