日期:2014-05-17  浏览次数:20779 次

高分求sql!
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     )    
谢谢!

------解决方案--------------------
select A.* from A,B where A.col1 <> B.col1 and A.col2 <> B.col2
------解决方案--------------------
SELECT * FROM A
MINUS
SELECT * FROM B

------解决方案--------------------
使用minus之后两段sql都用上了索引扫描,而使用外关联的话,会出现全表扫描的情况,建议使用MINUS
------解决方案--------------------
数据量越大minus的优势就越大
------解决方案--------------------
楼主说用外连接来做的话,要求2个字段都不为空
update A(B)
set col2= '123456 ' //不会出现的任意值
where col2 is null

select a.* from A,B
where A.col1=B.col1(+)
and A.col2=B.col2(+)
and (B.col1||B.col2) is null //这句是取得你所需要的