性能上我大概了解了,不过  我执行了这样一个语句SELECT
    swg
FROM
    t_histable
WHEREAND status='0'
AND not exists
    (
        SELECT
            swg
        FROM
            t_histable
        WHERE      
       STATUS = '1'
    )
子句查出来的是一条记录   如果改成
SELECT
    swg
FROM
    t_histable
WHEREAND status='0'
AND swglm not in
    (
        SELECT
            swg
        FROM
            t_histable
        WHERE      
       STATUS = '1'
    )
查出来的结果没问题,但是用not exists 却查不出来记录 ,   搞不清楚了  

解决方案 »

  1.   

    可能表达的不够清楚,子句查出来是一条记录,用not in  查询结果没问题,可以查出一批数据,但是换成not exists却查不到数据
      

  2.   

    在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(OUTER JOINS)或NOT EXISTS.
    例子:(高效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB’)
    (低效)SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB’)
      

  3.   

    其实主要是想知道为什么  not in  可以查出来数据  改成not exists却查不到数据来...
      

  4.   


    --写法有点小问题,改为这样
    SELECT
      swg
    FROM
      t_histable
    WHERE status='0'
    AND not exists
      (
      SELECT
      swg
      FROM
      t_histable t1
      WHERE   
      STATUS = '1'
      and t_histable.swglm=t1.swg--必须关联到你的查询表,不然not exists变成了对于整个查询变成了一个布尔型的了
      )