对于not  in来说
如果select empno from emp1 where job='SALE'结果集很大
每从emp查询一条记录,都会在这个无索引的结果集里面全部扫描一次这种乘积似的扫描,很夸张的在这样的情况下表连接方式稍微好一些但事实上,在一些极端情况下,到底哪个语句快,只能根据具体环境测量btw: 
select a.empno from emp a ,emp1 b where a.empno=b.empno(+) and b.empno is null and b.job='SALE';and b.job='SALE'  这个条件没有任何意义

解决方案 »

  1.   

    delete from table_name a where rowid<(select max(rowid) from table_name where column1=a.column1 and column2=a.column2 and colum3=a.colum3 and ...);对于表中的任一条纪录,rowid都是唯一的
    这条语句的意思就是,将表中col1,col2,clo3……相同的最大的rowid取出来,将小于它的rowid对应的纪录删掉那么将保留rowid最大的一条纪录
      

  2.   

    delete from table_name a where rowid<(select max(rowid) from table_name where column1=a.column1 and column2=a.column2 and colum3=a.colum3 and ...);对于表中的任一条纪录,rowid都是唯一的
    这条语句的意思就是,将表中col1,col2,clo3……相同的最大的rowid取出来,将小于它的rowid对应的纪录删掉那么将保留rowid最大的一条纪录
      

  3.   

    b.empno is null 那么 b.job也必将为null所以你的那一条语句将得不到任何结果
      

  4.   

    1、如果col1,col2等都相同的话,应该是重复记录(但是其ROWID不同),应该予以删除。
    但是删除时还得留一条记录,上面这个语句就是说,在子查询里查出重复记录的最大ROWID,然后将所有小于该ROWID的记录全部删除,注意这时不能用‘<=’。
    这样就达到了删除重复记录的目的。
    2、用NOT IN时原理是对A表中的每一条记录,SQL都要到emp1中查找是否存在。
    而用两表联合查询时,SQL首先把数据连接起来,再由查询条件来选择需要的数据,肯定要快哦。
      

  5.   

    1、如果col1,col2等都相同的话,应该是重复记录(但是其ROWID不同),应该予以删除。
    但是删除时还得留一条记录,上面这个语句就是说,在子查询里查出重复记录的最大ROWID,然后将所有小于该ROWID的记录全部删除,注意这时不能用‘<=’。
    这样就达到了删除重复记录的目的。
    2、用NOT IN时原理是对A表中的每一条记录,SQL都要到emp1中查找是否存在。
    而用两表联合查询时,SQL首先把数据连接起来,再由查询条件来选择需要的数据,肯定要快哦。
      

  6.   

    SQL> select * from emp;E                                                                               
    -                                                                               
    1                                                                               
    2                                                                               
    3                                                                               
    4                                                                               
    5                                                                               SQL> select * from emp1;E JOB                                                                           
    - ----------                                                                    
    1 sale                                                                          
    2 sale                                                                          
    4 clerk                                                                         
    5 manager                                                                         1* select a.empno from emp a where a.empno not in (select empno from emp1 where job = 'sale')
    SQL> /E                                                                               
    -                                                                               
    3                                                                               
    4                                                                               
    5     ----NOT IN 查询出的数据   
    SQL> select a.empno from emp a,emp1 b where a.empno = b.empno(+) and b.empno is null and b.job ='sale';未选定行-----可以看出该语句绝对是错的。
    SQL> 1* select a.empno from emp a,emp1 b where a.empno = b.empno(+) and (b.empno is null or b.job <>'sale')
    SQL> /E                                                                               
    -                                                                               
    3                                                                               
    4                                                                               
    5                                                                               ---这种语句可行。
    SQL> 1* select a.empno from emp a,emp1 b where a.empno = b.empno(+) and nvl(b.job,'@@@') <>'sale' 
    SQL> /E                                                                               
    -                                                                               
    3                                                                               
    4                                                                               
    5                                                                               
    --这种语句也可行。
    SQL> hope this can help u
      

  7.   

    select a.empno from emp a where a.empno not in(select empno from emp1 where job='SALE');
    可以改写为
    select a.empno from emp a where not exists(select 1 from emp1 where emp1.job='SALE' and emp1.empno = a.empno);或者写成
    select a.empno from emp a 
    minus 
    select empno from emp1 where job='SALE';