当前位置: 代码迷 >> Oracle管理 >> 小白问个rownum的有关问题
  详细解决方案

小白问个rownum的有关问题

热度:89   发布时间:2016-04-24 04:15:31.0
小白问个rownum的问题
select a.* from yg a where rownum< 10
 minus
select b.* from yg b where rownum< 3;


        NO NAME           SALARY
---------- ---------- ----------
         3 c                 300
这段为什么只返回了rownum=3的记录?

______________________________________________________________
select rownum,a.* from yg a where rownum<10
minus
select rownum,b.* from yg b where rownum<3;
    ROWNUM         NO NAME           SALARY
---------- ---------- ---------- ----------
         3          3 c                 300
         4          3 c                 300
         5          3 c                 300
         6          3 c                 300
         7          3 c                 300
         8          3 c                 300
         9          3 c                 300
而加了rownum后就能返回正确的记录了,为什么,rownum怎么用?

 
------解决方案--------------------
你数据的问题,你的每行数据的值都是一样的
加了rownum之后,每行的数据就不一样了(rownum列的值不相同)
因此执行minus之后会有不同的结果
------解决方案--------------------
楼主可以把minus两边的sql 都执行一下,简单做一下排除就知道结果了,主要问题还是你的数据存在重复,加了rownum就不是重复记录了。

关于rownum的用法,有一段总结。
很多人都知道ROWNUM只适用于小于或小于等于,如果进行等于判断,那么只能等于1,不能进行大于的比较。但是却并不了解造成这种限制条件的机制是什么。
对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且rownum不能以任何表的名称作为前缀。
其实ROWNUM的返回很简单,ROWNUM总是从1开始,不管当前的记录是否满足查询结果,ROWNUM返回的值都是1,如果这条记录的值最终满足所有的条件,那么ROWNUM会递加,下一条记录的ROWNUM会返回2,否则下一条记录的ROWNUM仍然返回1。
理解了这一点,就清楚为什么一般的ROWNUM大于某个值或等于某个不为1的值是无法返回结果的,因此对于每条记录的ROWNUM都是1,而ROWNUM为1不满足查询的结果,所以下一条记录的ROWNUM不会递增,仍然是1,因此所有的记录都不满足条件
------解决方案--------------------
引用:
Quote: 引用:

你数据的问题,你的每行数据的值都是一样的
加了rownum之后,每行的数据就不一样了(rownum列的值不相同)
因此执行minus之后会有不同的结果


按照你说的做了一遍,可以了。 
还想请教两个问题:
1.是不是说,minus对于一样的数据只会返回 一个?  
2.一样的数据在存储的时候rowid是不一样的,那么minus是不能自动辨别的?

集合操作去重引起的
------解决方案--------------------


我查看了下执行计划,原来做MINUS之前会先做distinct。
这就是为什么第一条sql只会返回一条数据