免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1142 | 回复: 2
打印 上一主题 下一主题

请教个sql语句 ,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-22 09:56 |只看该作者 |倒序浏览
我想查询最新的500条数据,用
select a.recid
           from aaa a, bbb b
          where a.recid = b.docid
            and b.propc = 'xxx'
and rownum<500
            order by a.lrsj desc
结果查询到最老的500条。
而用
select * from (select a.recid
           from aaa a, bbb b
          where a.recid = b.docid
            and b.propc = 'xxx'
            order by a.lrsj desc)
and rownum<500
就可以取得最新的500条,这个是为什么呢,不用子查询,能实现目标吗?

论坛徽章:
0
2 [报告]
发表于 2006-09-22 23:14 |只看该作者
第一个语句会先求rownum < 500再排序
第二个语句会先排序, 在求rownum< 500

论坛徽章:
0
3 [报告]
发表于 2006-09-23 01:57 |只看该作者
原帖由 gengxl 于 2006-9-22 09:56 发表
我想查询最新的500条数据,用
select a.recid
           from aaa a, bbb b
          where a.recid = b.docid
            and b.propc = 'xxx'
and rownum<500
            order by a.lrsj desc
...


这个就是要使用oracle TOP-N sql的写法

实际上第一个查询之所以得不到想要的结果,原因就在rownum这个变量的赋值。oracle在执行这条语句时,在分析完sql以后,一旦a.recid = b.docid and b.propc = 'xxx' 条件满足,此时oracle就会先将rownum赋值一次,而order by这个clause会在sql搜索整个完毕以后才会执行,所以不会得到想要的结果集。

保险的写法是采用TOP-N sql的写法(也就是类似于你的第二条sql),还有在某些情况下,如果查询条件中包括primary key,这样即使是第一条sql,也可以得到正确的结果。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP