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,因此所有的记录都不满足条件
------解决方案--------------------
集合操作去重引起的
------解决方案--------------------

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