oracle 反联结 NOT IN、NOT EXISTS
2014-03-23 13:31
405 查看
用SCOTT/TIGER登录。
创建小表:
使用NOT IN:
结果:
使用NOT EXISTS:
结果和NOT IN一样。
遇到NULL值时:
NOT IN:
结果:
NOT EXISTS:
结果:
NOT IN和NOT EXISTS处理NULL的时候,是不一样的。
所以,最好使用NOT EXISTS,但是使用NOT IN比较易于理解。
如果使用NOT IN,可以使用如下几种方法解决NULL的问题:
1、使用NVL函数:
说明:NVL (expr1, expr2)->expr1为NULL,返回expr2;不为NULL,返回expr1。注意两者的类型要一致。
2、使用IS NOT NULL:
3、使用NOT NULL约束。
创建小表:
CREATE TABLE EMP1 AS WITH TEMP_EMP AS (SELECT ROWNUM RN, E.* FROM EMP E) SELECT * FROM TEMP_EMP WHERE RN BETWEEN 4 AND 10;
使用NOT IN:
SELECT EMPNO, ENAME FROM EMP WHERE EMPNO NOT IN (SELECT EMPNO FROM EMP1);
结果:
使用NOT EXISTS:
SELECT T1.EMPNO, T1.ENAME FROM EMP T1 WHERE NOT EXISTS (SELECT EMPNO FROM EMP1 T2 WHERE T1.EMPNO = T2.EMPNO);
结果和NOT IN一样。
遇到NULL值时:
NOT IN:
SELECT EMPNO, ENAME FROM EMP WHERE EMPNO NOT IN (SELECT NULL FROM EMP1);
结果:
NOT EXISTS:
SELECT T1.EMPNO, T1.ENAME FROM EMP T1 WHERE NOT EXISTS (SELECT NULL FROM EMP1 T2 WHERE T1.EMPNO = T2.EMPNO);
结果:
NOT IN和NOT EXISTS处理NULL的时候,是不一样的。
所以,最好使用NOT EXISTS,但是使用NOT IN比较易于理解。
如果使用NOT IN,可以使用如下几种方法解决NULL的问题:
1、使用NVL函数:
SQL> SELECT MGR FROM EMP WHERE MGR NOT IN (SELECT MGR FROM EMP1); 未选定行 SQL> SELECT MGR FROM EMP WHERE MGR NOT IN (SELECT NVL(MGR, 0) FROM EMP1); MGR ---------- 7902 7788 7782 SQL>
说明:NVL (expr1, expr2)->expr1为NULL,返回expr2;不为NULL,返回expr1。注意两者的类型要一致。
2、使用IS NOT NULL:
SQL> SELECT MGR FROM EMP WHERE MGR NOT IN (SELECT MGR FROM EMP1); 未选定行 SQL> SELECT MGR FROM EMP WHERE MGR NOT IN (SELECT MGR FROM EMP1 WHERE MGR IS NOT NULL); MGR ---------- 7902 7788 7782 SQL>
3、使用NOT NULL约束。
相关文章推荐
- oracle exists&not exists用法及与in&not in比较(10g)-开发系列(四)
- Oracle中的 IN, NOT IN和 EXISTS, NOT EXISTS的區別
- 【转载】[ORACLE]详解not in与not exists的区别与用法
- Oracle 中in ,not in 和exists,not exists之间的区别
- 注意事项: Oracle Not Exists 及 Not In 使用
- oracle中关于in和exists,not in 和 not exists
- ORACLE]详解not in与not exists的区别与用法
- Oracle中not exists 与not in 的使用情况
- oracle中in,not in和exists,not exists之间的区别
- oracle-not in 和not exists的区别
- Oracle中not exists 与not in 的使用情况
- oracle中in,not in和exists,not exists之间的区别
- oracle中in,not in和exists,not exists之间的区别
- oracle in,exists,not in,not exists
- [ORACLE]详解not in与not exists的区别与用法
- [ORACLE]详解not in与not exists的区别与用法(not in的性能并不差!)
- oracle中in,not in和exists,not exists之间的区别
- oracle中in,not in和exists,not exists之间的区别
- Oracle,用left join 替代 exists ,not exists,in , not in,提高效率
- 注意事项: Oracle Not Exists 及 Not In 使用