有一个表如下 
userinfo
id  name  age
1   张三  18
2   李四  20
3   王五  22
... 中间省略若干项
60  马六  77表id为主键,自动增长列,id值无间隔1...60
写一个查询
select Max(id) from (select Top 10 id from userinfo ) as a
查询结果为60
加上排序
select Max(id) from (select Top 10 id from userinfo order by id ) as a
结果为10
求解答

解决方案 »

  1.   

    加上order by id,对数据排序后显示数据,再进行筛选.
    不加order by id,按照系统默认的排序(如果有的话)或者按照数据插入表的时间顺序显示数据,再进行筛选.
      

  2.   

    可是,如果是自动增长列的话,插入时间肯定是由小到大的,先后顺序肯定是不会乱的。
    SQL2008采用默认安装,那么默认排序不是应该是按照主键来吗?
    难道是倒序?
    还是因为Max的查询机制的关系?
      

  3.   

    如果ID为自增列,第一种情况不可能(除非反复更新后数据的存储顺序已经乱).select Max(id) from (select Top 10 id from userinfo ) as a不加order时, top 10 id 是以其存储顺序排列的.
      

  4.   


    不过,这也没什么,你没必要去研究数据是怎么存储的,用了 top 就应该严格地使用 order by ,这不会出错的.
      

  5.   

    我觉得你没有必要去研究这种问题.用了top,就加个order by,这样能保证你查询的正确性.
      

  6.   

    #1. 我自己创建一个表,按楼主的数据试了下。两个SQL查询出的结果是一样的
    #2. 出现楼主的现象,应该和max函数没有关系。楼主可分别执行2个select top 10 ......语句来测试一下结果
    #3. 至于select Top 10 id from userinfo 和select Top 10 id from userinfo order by id的结果为何不同。可参考一下(SQL SERVER技术内幕:存储引擎)中的相关章节
    不加order by时是按照数据库自己的存储逻辑来返回前10条记录的(不是磁盘的物理逻辑)。
      

  7.   


    select Max(id) from (select Top 10 id from userinfo order by id ) as a
    --这是个嵌套查询
    select Top 10 id from userinfo order by id 
    --这个是按id顺序排序,结果就1-10条记录
    --然后在Max(id),当然是最大值是10了。
      

  8.   

    加入order by 对数据排序了。