前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rownum的SQL需求

rownum的SQL需求

作者头像
bisal
发布2019-03-11 13:54:35
7090
发布2019-03-11 13:54:35
举报

《从一条"错误"的SQL,了解rownum的作用》提到的案例中,原始需求是:检索name是(aaa或者bbb)的前10条记录,其中一种写法,如下,

640?wx_fmt=png
640?wx_fmt=png

有朋友就问到,如果需求是:检索name是aaa的所有记录,以及前10条name是bbb的,如何实现?

为了方便说明,我们增加了数据,现在表中数据,如下所示,有19条aaa和11条bbb,

640?wx_fmt=png
640?wx_fmt=png

针对这个需求,“name是aaa”,这个很简单,就不说了,关键是如何同时得到“前10条name是bbb”。

第一种写法

惯性思维,我们先看下,如何得到“前10条name是bbb”,下面是其中一种,

640?wx_fmt=png
640?wx_fmt=png

现在的问题,就是如何同“name是aaa”的所有记录,进行整合。相当于合并两个结果集,用的连接关键字,肯定是OR,“前10条name是bbb”,可以考虑使用rowid,直接定位结果集。通过子查询,将两个结果集,进行了合并,得到的结果集,应该是19条aaa,和10条bbb,总计29条记录,

640?wx_fmt=png
640?wx_fmt=png

第二种写法

Oracle提供了分析函数,功能非常强大,在这方面,我算是菜鸟,用的很少,不过针对这需求,倒是可以用row_number(),他会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。

为了能得到前10条的bbb记录,我们增加了order by name desc,以让记录为bbb的,排前面,

640?wx_fmt=png
640?wx_fmt=png

在这个结果集上,进行过滤,一个条件是name='aaa'的,另一个是name='bbb' and rownum<=10,此时由于bbb的记录,已经排在前面,所以使用rownum<=10,可以检索出来,19条aaa的,10条bbb的,总计29条,但是和写法一不同的是,记录的顺序,由于子查询出来的结果集,按照name排序,因此得到的结果,就会排序,

640?wx_fmt=png
640?wx_fmt=png

当然,为了实现“检索name是aaa的所有记录,以及前10条name是bbb的”的需求,上面只是可能的两种方法,朋友们要感兴趣,可以发出来你们的方法,看看是否有更便捷的?

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年02月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档