当前位置: 代码迷 >> Oracle管理 >> oracle中not exist 跟not in的区别
  详细解决方案

oracle中not exist 跟not in的区别

热度:202   发布时间:2016-04-24 05:07:44.0
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  swgFROM  t_histableWHERE status='0'AND not exists  (  SELECT  swg  FROM  t_histable t1  WHERE     STATUS = '1'  and t_histable.swglm=t1.swg--必须关联到你的查询表,不然not exists变成了对于整个查询变成了一个布尔型的了  )
  相关解决方案