用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’ ;
在子查询中,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’ ;
where Key_no NOT EXISTS
(SELECT 'X' FROM table1 A,table2 B
WHERE A.Key_no=B.Key_no
)
SELECT 'X' 中的 'X'
是什么东西,是代表字段名字,还是就是一个特殊用法?
where Key_no NOT EXISTS
(SELECT key_no FROM table1 A,table2 B
WHERE A.Key_no=B.Key_no
)
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 )
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
)
用你的join写法,结果明显是实际的不符。
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)
where NOT EXISTS
(SELECT 1 FROM table2 B
WHERE table1.Key_no=B.Key_no)
这样是正确的,我已经运行起来了。谢谢大家,尤其 包子兄台。