not  in  的效率非常低,我知道如果是一个字段not  in  比较的话,  
可以用外关联来解决。但是两个字段组合起来判断是不是在另外一个表中也存在的问题该怎么写呢?  
比如  
     A表有两个字段  col1,col2(col2可能为null)  
     B表也有两个字段col1,col2(col2可能为null)  
我要取出A表的col1  和col2组合起来在表B中没有对应记录的,该如何写sql?  
现在我用not  in  效率非常差:  
Select  *  
From  A  t    
Where  (t.col1  ¦¦ Nvl(t.col2,  'NULL'))  not  in  (    
     Select  col1  ¦¦  Nvl(col2,  'NULL')  From  B  )  
谢谢!

解决方案 »

  1.   

    select A.* from A,B where A.col1<>B.col1 and A.col2<>B.col2
      

  2.   

    SELECT * FROM A
    MINUS
    SELECT * FROM B
      

  3.   

    使用minus之后两段sql都用上了索引扫描,而使用外关联的话,会出现全表扫描的情况,建议使用MINUS
      

  4.   

    数据量越大minus的优势就越大
      

  5.   

    楼主说用外连接来做的话,要求2个字段都不为空
    update A(B)
    set col2='123456' //不会出现的任意值
    where col2 is nullselect a.* from A,B
    where A.col1=B.col1(+)
    and A.col2=B.col2(+)
    and (B.col1||B.col2) is null  //这句是取得你所需要的