用NOT EXISTS替代NOT IN 
在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. 
例如: 
SELECT … 
FROM EMP 
WHERE DEPT_NO NOT IN (SELECT DEPT_NO 
                         FROM DEPT 
                         WHERE DEPT_CAT=’A’); 
为了提高效率.改写为: 
(方法一: 高效) 
SELECT …. 
FROM EMP A,DEPT B 
WHERE A.DEPT_NO = B.DEPT(+) 
AND B.DEPT_NO IS NULL 
AND B.DEPT_CAT(+) = ‘A’ 
(方法二: 最高效) 
SELECT …. 
FROM EMP E 
WHERE NOT EXISTS (SELECT ‘X’ 
                    FROM DEPT D 
                    WHERE D.DEPT_NO = E.DEPT_NO 
                    AND DEPT_CAT = ‘A’); 
20. 用表连接替换EXISTS 
     通常来说 , 采用表连接的方式比EXISTS更有效率 
      SELECT ENAME 
      FROM EMP E 
      WHERE EXISTS (SELECT ‘X’ 
                      FROM DEPT 
                      WHERE DEPT_NO = E.DEPT_NO 
                      AND DEPT_CAT = ‘A’); 
     (更高效) 
      SELECT ENAME 
      FROM DEPT D,EMP E 
      WHERE E.DEPT_NO = D.DEPT_NO 
      AND DEPT_CAT = ‘A’ ; 

解决方案 »

  1.   

    update table1 set error_flag=1 
    where Key_no NOT EXISTS 
         (SELECT 'X' FROM table1 A,table2 B
          WHERE A.Key_no=B.Key_no
         )
      

  2.   

    To:  baojianjun(包子)
        SELECT 'X'   中的 'X'
    是什么东西,是代表字段名字,还是就是一个特殊用法?
      

  3.   

    我这么写运行是同不过的update table1 set error_flag=1 
    where Key_no NOT EXISTS 
         (SELECT key_no FROM table1 A,table2 B
          WHERE A.Key_no=B.Key_no
         )
      

  4.   

    update table1 set error_flag=1 where not EXISTS (select 1 form talbe2 WHERE TABLE2.Key_no =TABLE1.Key_no )
      

  5.   

    我們可以用out join來代替Not In我現在假定有A﹐B兩個表﹐找出A中odr_no不在B中的select A.*
      from A,B
     where A.fact_no = B.fact_no (+)
       and A.odr_no = B.odr_no (+)
       and A.odr_no Is Not Null這樣得出的結果相當于下面的語法產生出的結果﹕ select A.*
      from A
     where A.odr_no Not In (select odr_no from B )
      

  6.   

    TO: baojianjun(包子) and  bzszp(www.bzszp.533.net)    两位,现在是语法都通不过。 不管是用那种写法。select * from table1
    where no exists
    (
        select 1 from table2 a,table1 b 
        where a.gsn_no=b.gsn_NO
    )还有:update table1 set error_flag=1 
    where Key_no NOT EXISTS 
         (SELECT key_no FROM table1 A,table2 B
          WHERE A.Key_no=B.Key_no
         )语法都是错误的。
    select * from table1
    where no exists
    (
        select X from table2 a,table1 b 
        where a.gsn_no=b.gsn_NO
    )
      

  7.   

    To: hlp912(孤枕難眠)
       用你的join写法,结果明显是实际的不符。
      

  8.   

    update table1 set error_flag=1 
    where Key_no NOT EXISTS 
         (SELECT key_no FROM table1 A,table2 B
          WHERE A.Key_no=B.Key_no
         )
    更改為:
    update table1 set error_flag=1 
    where NOT EXISTS 
         (SELECT key_no FROM table1 A,table2 B
          WHERE A.Key_no=B.Key_no)
         
      

  9.   

    update table1 set error_flag=1 
    where NOT EXISTS 
         (SELECT 1 FROM table2 B
          WHERE table1.Key_no=B.Key_no)
    这样是正确的,我已经运行起来了。谢谢大家,尤其 包子兄台。