日期:2014-05-17  浏览次数:20505 次

求解惑:max函数问题
本帖最后由 athwind 于 2013-10-13 17:18:10 编辑
有一个表tb,主键为ID,自增长int类型,3条记录
ID
3
6
7
为了获取前2条记录的最大ID,于是很easy的写出了以下语句:
select max(ID) from (select top 2 ID from tb) t
------结果
7
很困惑,应该为6才对啊,因为select top 2 ID from tb的返回
3
6
测试发现select max(ID) from (select top N ID from tb) t始终返回当前表的最大值
只有在N=1时,即:
select max(ID) from (select top 1 ID from tb) t
或显式的加了order by之后才符合预期,即:
select max(ID) from (select top N ID from tb order by ID) t
求解惑
ps:数据库为Sql Server 2008

------解决方案--------------------
引用:
有一个表tb,主键为ID,自增长int类型,3条记录
ID
3
6
7
为了获取前2条记录的最大ID,于是很easy的写出了以下语句:
select max(ID) from (select top 2 ID from tb) t
------结果
7
很困惑,应该为6才对啊,因为select top 2 ID from tb的返回
3
6
测试发现select max(ID) from (select top N ID from tb) t始终返回当前表的最大值
只有在N=1时,即:
select max(ID) from (select top 1 ID from tb) t
或显式的加了order by之后才符合预期,即:
select max(ID) from (select top N ID from tb order by ID) t
求解惑
ps:数据库为Sql Server 2008


我用的是sql server 2008r2,做了一个实验,就是正常的,没有你说的这种问题:
create table tt(id int not null identity(1,1))


insert into tt
default values

insert into tt
default values

insert into tt
default values

insert into tt
default values

insert into tt
default values

insert into tt
default values

insert into tt
default values




select * from tt

delete from tt
where id not in (3,6,7)

select top 2 ID from tt
/*
ID
3
6
*/

select max(ID) 
from (
select top 2 ID from tt
) t
/*
(无列名)
6
*/

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

select top 2 id
from
(
select *,rn=row_number() over(order by id desc) from tb
)t
where rn<=2

这个可以 学习了 

都有病吗?我是问这种现象的原因的,是问why,不是how


Why?逻辑上如果先Top再Aggregate可以得到期望的结果,不过优化器可能会自作聪明地将Aggregate提前,先Aggregate再To