首页 新闻 会员 周边

SQL 08 执行问题求教

1
悬赏园豆:20 [待解决问题]

SQL Server 2008

本人写了好几年SQL语句了,从来没注意到这件事情。

 

例如:

数据表如下:

ID  EMPNO  NAME  AGE  

1   26929   Jerome   28
2   28394   Quince  27
3   20983   Green   30
4   27189   Mike     30
5   23167   Arishy   30
6   26371   Yager   29

我写了SQL语句想取得第3、4笔数据,测试分页玩的。

select  top 2 * from (select top 4 * from Member ) m  order by m.RowID desc

我执行中间那一段子查询:select top 4 * from Member

取得的是:

1   26929   Jerome   28
2   28394   Quince  27
3   20983   Green   30
4   27189   Mike     30

但是整个SQL语句的结果却是:

5   23167   Arishy   30
6   26371   Yager   29

真的不知道到底怎么会出现这种情况,请高手指教。

Jerome Wang的主页 Jerome Wang | 初学一级 | 园豆:180
提问于:2010-12-22 15:39
< >
分享
所有回答(4)
0

select  top 2 * from (select top 4 * from Member order by m.RowID asc) m  order by m.RowID desc

就是你想要的结果

   之所以会出现这种情况 你记住 TOP 4 随机返回 4 行 只有在你指定了 order by 之后才是有序的返回你所要的行

这点很重要

追索 | 园豆:625 (小虾三级) | 2010-12-22 15:57
那如果我写: select top 2 * from member 返回的不是前两笔数据?
支持(0) 反对(0) Jerome Wang | 园豆:180 (初学一级) | 2010-12-22 16:25
你这样写的话默认返回前两笔这么跟你解释吧 top是只扫描一定范围 如果整个语句结束都没指定order by的话 默认返回前几行 但你刚语句中出现了desc 也就是说从你降序的结果集4行范围中取2行
支持(0) 反对(0) 追索 | 园豆:625 (小虾三级) | 2010-12-22 16:43
谢谢回复。不过我觉得您杰斯的不太合理。假如写成: select top 2 * from (select top 4 * from Member order by m.RowID asc) m order by m.RowID desc 那么就是返回第3、4笔数据了。 我想请问您能解释一下这个SQL语句的执行顺序吗?
支持(0) 反对(0) Jerome Wang | 园豆:180 (初学一级) | 2010-12-22 16:49
不用谢,本人不善表达 ,聚集索引扫描Member先升序取4行然后再把这4行降序取2行, 和之前一种比较就是 聚集索引扫描Member先降序然后在4行范围中取2行
支持(0) 反对(0) 追索 | 园豆:625 (小虾三级) | 2010-12-22 16:58
如果这么解释还不行的话 那我实在没办法了。关于top还有很多需要注意的地方找个时间我写个随笔加上图(执行步骤)我想大家可能会更加明白
支持(0) 反对(0) 追索 | 园豆:625 (小虾三级) | 2010-12-22 17:01
好,麻烦到时候通知俺一下,俺可是积极追求进步滴!
支持(0) 反对(0) Jerome Wang | 园豆:180 (初学一级) | 2010-12-22 17:34
随笔地址 http://www.cnblogs.com/zhuisuo/archive/2010/12/23/1914790.html
支持(0) 反对(0) 追索 | 园豆:625 (小虾三级) | 2010-12-23 14:25
0

t-sql?既然都08了,用哪个Row_Number函数吧。。。

顾晓北 | 园豆:10844 (专家六级) | 2010-12-22 16:02
感谢回复,这里只是实验。
支持(0) 反对(0) Jerome Wang | 园豆:180 (初学一级) | 2010-12-22 16:25
0

楼上说的正确,在子查询里面也要 order by (asc) 排序一下,否则会返回整个表的最后的2行数据

Lsp000 | 园豆:225 (菜鸟二级) | 2010-12-22 16:06
你在sql2000里面实验一下就知道了
支持(0) 反对(0) Jerome Wang | 园豆:180 (初学一级) | 2010-12-22 16:26
0

我实验了一下,发现一些东东:top似乎是最后执行的,所有记录Order by 后再用top选取排好序的记录。

流水殇 | 园豆:404 (菜鸟二级) | 2010-12-22 17:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册