rownum的SQL需求

这是杂货铺的第424篇文章

 

****正在进行博客之星的投票,还请为我投上宝贵的一票,各位能用下面两种方式,登陆投票地址,

(1) 识别图中二维码

(2) 打开链接:https://bss.****.net/m/topic/blog_star2018/index

找到006号,点击“投票”,非常感谢!

rownum的SQL需求  rownum的SQL需求

 

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

rownum的SQL需求

 

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

 

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

rownum的SQL需求

 

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

 

第一种写法

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

rownum的SQL需求

 

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

rownum的SQL需求

 

第二种写法

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

 

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

rownum的SQL需求

 

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

rownum的SQL需求

 

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