解决方案 »

  1.   

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

  2.   

    楼主可以把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,因此所有的记录都不满足条件
      

  3.   


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

  4.   

    minus是对两个查询的结果集做运算,和基本表本身已经没太大关系了
      

  5.   


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

  6.   

    SQL> select distinct nn from tt;NN
    ----------------------------------------------------------
    aSQL> select nn from tt;NN
    ----------------------------------------------------------
    a
    aSQL> select distinct rowid,nn from tt;ROWID              NN
    ------------------ ---------------------------------------
    AAAlG/AAEAAAChmAAB a
    AAAlG/AAEAAAChmAAA a
      

  7.   


    查询结果一:
    NO NAME           SALARY     ROWID
    ---------- ---------- ----------       --------------------------------------------------------------------------------
             1 a                 100      AAASTmAAFAAAAHnAAA
             2 b                 200 AAASTmAAFAAAAHnAAB
    查询结果二:
    NO NAME           SALARY ROWID
    ---------- ---------- ---------- --------------------------------------------------------------------------------
             1 a                 100      AAASTmAAFAAAAHnAAA
             2 b                 200      AAASTmAAFAAAAHnAAB
             3 c                 300      AAASTmAAFAAAAHnAAC
             3 c                 300      AAASTmAAFAAAAHnAAD
             3 c                 300      AAASTmAAFAAAAHnAAE
             3 c                 300      AAASTmAAFAAAAHnAAF
             3 c                 300      AAASTmAAFAAAAHnAAG
             3 c                 300      AAASTmAAFAAAAHnAAH
             3 c                 300      AAASTmAAFAAAAHnAAI
    对于这两个查询结果来说,minus是基于ROWID进行的,还是基于 *  进行的
    如果是基于* 进行的,是不是先进行一次   查询结果二  对  查询结果一  做  集合减运算,得到结果三:
         3 c                 300      AAASTmAAFAAAAHnAAC
             3 c                 300      AAASTmAAFAAAAHnAAD
             3 c                 300      AAASTmAAFAAAAHnAAE
             3 c                 300      AAASTmAAFAAAAHnAAF
             3 c                 300      AAASTmAAFAAAAHnAAG
             3 c                 300      AAASTmAAFAAAAHnAAH
             3 c                 300      AAASTmAAFAAAAHnAAI
    那么最后是怎么得到:
     NO NAME           SALARY
    ---------- ---------- ---------- ----------
             1          3 c                 300
      

  8.   

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

  9.   

    参考
    http://haohaoxuexi.iteye.com/blog/2095095
      

  10.   

    Oracle会对minus后的结果集进行去重,即如果A中原本多条相同的记录数在进行A minus B后将会只剩一条对应的记录
      

  11.   

    我看了下执行计划,应该是在Minus之前就先去重了。
      

  12.   

    那么就是说通过minus是无法输出类似
    NN
    ----------------------------------------------------------
    a
    a
    结果了?
      

  13.   

    那么就是说通过minus是无法输出类似
    NN
    ----------------------------------------------------------
    a
    a
    结果了?
    你到底是需要怎么样的minus,为什么需要返回两行?
      

  14.   

    那么就是说通过minus是无法输出类似
    NN
    ----------------------------------------------------------
    a
    a
    结果了?
    你到底是需要怎么样的minus,为什么需要返回两行?

    想明白了,如下结果通过minus是没法得到的:
    NO NAME           SALARY 
    ---------- ---------- ---------- 
             3 c                 300     
             3 c                 300      
             3 c                 300     
             3 c                 300    
             3 c                 300      
             3 c                 300    
             3 c                 300      
    问题原因我也想清楚了,是没有对MINUS的基本工作原理了解全面