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

oracle中not exist 和not in的区别
性能上我大概了解了,不过 我执行了这样一个语句

SELECT
  swg
FROM
  t_histable
WHERE

AND status='0'
AND not exists
  (
  SELECT
  swg
  FROM
  t_histable
  WHERE  
  STATUS = '1'
  )
子句查出来的是一条记录 如果改成
SELECT
  swg
FROM
  t_histable
WHERE

AND status='0'
AND swglm not in
  (
  SELECT
  swg
  FROM
  t_histable
  WHERE  
  STATUS = '1'
  )
查出来的结果没问题,但是用not exists 却查不出来记录 , 搞不清楚了

------解决方案--------------------
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用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’)

------解决方案--------------------
SQL code

--写法有点小问题,改为这样
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变成了对于整个查询变成了一个布尔型的了
  )