前几天去面试,遇到2个问题:1, 有两个大表  A , B  
     如何取出 A 表有但是B表没有的数据?2,有一个大表 A ,某一字段 ID 有重复记录,
     如何将ID重复的记录删除只保存一笔?以上问题在平时工作中也会经常遇到,也都解决过,不过数据量都不大(最多的是千万条记录)。当时考虑到面试的岗位是移动公司的数据挖掘,数据量肯定巨大,一时没想出来什么好的办法。
回答的是:  1 ,用hash 连接进行运算,但是对hash 运算不是很熟悉,没能写出来。
           2, 使用 max函数取rowid 关联。由于都是手写sql,感觉做的不是很好。各位有什么好的思路,不妨探讨一下,谢谢~
           

解决方案 »

  1.   

    1、主键直接MINUS
    2、用分析函数
      

  2.   

    1、 minus
    2、 根据条件得到rownum 根据rownum作为条件删除
      

  3.   

    1、 minus
    2、 根据条件得到rowid 根据rowid 作为条件删除 
      

  4.   


    有考虑过用minus直接运算,但是数据量应该是很大的(亿条级别的),如果用minus的话,会不会很慢?
      

  5.   

    我自己测试了一下,
    A表和B表都1千万条记录,
    使用minus的查询时间是最长的,最快的是not EXITS,其次是JOIN
    如果是亿万的话,应该是not EXITS最快的吧,到底用哪个要看实际情况的吧,
      

  6.   

    1.select * from a where not exists(select * from b where a.和B表关联的键值 = b.和A表关联的键值);
      

  7.   

    数据量大 应该是用not exists去掉重复数据 应数据库的伪列 rowid 
      

  8.   

    1、肯定用not exists效率最高
    2、DELETE FROM t1 b 
             WHERE EXISTS 
                 (SELECT 1 
                    FROM t1 a 
                   WHERE b.a1 = a.a1 
                GROUP BY a1 
                  HAVING COUNT(a1) > 1 AND b.rowid <> MAX(a.rowi))