前言:
今天在写一条sql查询语句,其需要从一个表A中返回所有A不再表B中的结果集,当然,这种实现最方便的方法就是用NOT IN。
如:select a.* from a where a.id not in (select id from b where…..)
我们大家都知道很多sql方面的文章都建议大家尽量不要使用NOT IN的方法,因为这种方法的效率不高。那有没有替代的办法呢?(声明因为当时的情况要求不能使用储存过程,所以只有写sql语句)和同事实验了一下,结果用以下方法实现了。
目的:
替换NOT IN 方法。
说明:
在单条SQL语句中,不使用储存过程,不使用临时表。使用存储过程和临时表不再本文的讨论范围中。
实现:
例:
表aa:结构
id value ……
1 a
2 b
3 c
4 d
5 e
6 f
---------------------------------------------------------------------------------------------
表bb:结构
id ……
2
4
6
现在我要取表aa里的所有字段,条件是aa的id值不在bb的id值当中(not in)。也就是应该返回所有id为奇数的字段
使用NOT IN的SQL:
select * from aa where id not in(select id from bb)
就一条语句,简单明了,可惜效率不高,而且公司规范要求尽量不用NOT IN,害我费了好大事crying……
改造后的SQL:
select cc.id,cc.value from (select aa.*,bb.id as tempcolum from aa left join bb on aa.id=bb.id) as cc where cc.tempcolum is null
解释一下。在开始时候我最早想用内联表的方式,可是无论如何也每找到一个好的办法,干脆就是实现不了。(大家有好办法指教先。)
后来自己考虑了一下NOT IN的逻辑,A NOT IN B就是说A是主体,B起到的之不过是一个判断作用,我们可以先把所有符合条件的A记录全部查询出来而不管他是否属于B,然后再从这里剔除值同时属于B的部分。
Select aa.* from aa
但是仅仅这样是不够的,我们无法利用这个返回的结果集判断是否属于B并排除它,为此,我想到构造一个临时的列,这个列的值应该是在A的结果集范围内,所有在B中的值。而这个结果集的主体应该是所有满足先决条件的A,然后加上满足条件的B,而不满足条件的B值则不再考虑范围内,所以用了left join。
这一段是关键,不知道我阐述清楚了没有,没明白的继续看
于是就出来这一句。
select aa.*,bb.id as tempcolum from aa left join bb on aa.id=bb.id
没看明白上面的看结果集就明白了
id value tempcolum
---------------------------------------------
1 a NULL
2 b 2
3 c NULL
4 d 4
5 e NULL
6 f 6
看到这个结果集我想大家都明白我的意思了吧。对了,我们就是要对这个结果集进行二次操作。
相信大家都看到了,生成的这个结果集包含了所有符合条件的表aa字段和bb的id,如果aa中的值在bb中,则tempcolum的值就不会为null,如果不在就是null,这样我们只需要从这个结果集里查询所有tempcolum值为null的就可以满足我们的要求了
所以最终的sql出来了
select cc.id,cc.value from (select aa.*,bb.id as tempcolum from aa left join bb on aa.id=bb.id) as cc where cc.tempcolum is null
我们只需要id和value两个字段,其他的就不要了。
结果
id value
-------------------------
1 a
3 c
5 e
ok,实现了,希望对大家有帮助。
原文出处:http://www.cnblogs.com/bbcw/archive/2005/02/04/101684.html
分享到:
相关推荐
### Oracle语句规划详解 #### 一、Oracle语句优化的重要性 在数据库管理与开发过程中,优化Oracle SQL语句对于提升系统的整体性能至关重要。优化不仅仅意味着更快的数据查询速度,还能减少资源消耗,提高数据库...
- **推荐方案**:改用NOT EXISTS或外连接加判断为空的方式替换NOT IN。 ##### 3. LIKE操作符 - **使用技巧**:LIKE操作符支持通配符查询,但使用不当会影响性能。例如,“%5400%”不会使用索引;而“X5400%”会...
总结以上内容,ORACLE数据库SQL语句的编写优化涉及多方面知识,包括优化器的合理选择、高效的表访问方法、共享SQL语句的使用、索引的正确配置和应用、SQL内部操作的处理以及低效SQL语句的识别与优化等。在实际操作中...
在Oracle中编写SQL语句时,需要注意以下几点: - **大小写敏感性**:Oracle数据库默认对对象名不区分大小写,但为了保持一致性,建议使用大写字母。 - **分号结尾**:每条SQL语句通常以分号结尾。 - **关键字与...
Oracle数据库在优化SQL语句方面有一系列的规范和最佳实践,以提高查询效率和系统性能。以下是基于给定标题和描述中的知识点的详细说明: 1. **查询规范**: - **别名的使用**:在查询表时,推荐为所有字段指定表...
Oracle SQL语句优化是数据库管理中的一个重要环节,通过优化SQL语句可以显著提升系统的响应速度、提高数据库资源的利用率以及改善用户体验。本文将从多个角度出发,详细介绍Oracle SQL语句优化的技术要点。 #### IN...
Oracle SQL编写规范是指在编写SQL语句时的一些基本原则和方法,旨在提高SQL语句的执行效率和可读性。以下是Oracle SQL编写规范的详细解释: 1. 尽量用索引,特别在从大量数据中返回小部分数据时 使用索引可以大大...
Oracle SQL 中判断值为空或 Null 的方法有多种,在本文中,我们将介绍 Oracle 和 SQL Server 中的空值判断方法。 Oracle 中的空值判断 在 Oracle 中,可以使用 `NVL` 函数来判断值为空或 Null。`NVL` 函数的语法...
2. **替换NOT IN操作符**:NOT IN操作符无法利用索引,应改用NOT EXISTS或外连接结合空值判断。这样可以确保查询能够利用索引,提高性能。 3. **避免使用不等于()操作符**:不等于操作符会导致全表扫描,不使用...
在Oracle数据库中,SQL语句的数据优化是提升数据库性能的关键环节。以下是一些关于SQL优化的重要知识点: 1. **避免使用IN操作符**:IN操作符可能导致全表扫描,可以考虑使用EXISTS替换,因为EXISTS通常更高效,...
这些JAR文件包含了与Oracle 8.0数据库通信所需的类和资源,例如`oracle.jdbc.OracleDriver`,这是Oracle JDBC驱动的主类,需要在Java程序中注册以建立数据库连接。 在项目中使用这个驱动包时,你需要将其添加到项目...
在Oracle中,SQL语句是与数据库交互的主要工具,包括了数据查询、数据插入、更新和删除等操作。以下是关于"oracle基本语句"的一些详细解释: 1. **SELECT语句**:这是SQL中最基础的查询语句,用于从数据库中检索...
- `IN` 和 `NOT IN`:检查值是否在子查询的结果集中。 - `EXISTS` 和 `NOT EXISTS`:检查子查询是否返回任何行。 8. **游标** - 游标允许逐行处理查询结果,常用于存储过程和PL/SQL块。 9. **触发器** - ...
Oracle SQL 是一种强大的数据库查询语言,它用于管理和处理Oracle数据库中的数据。以下是对提供的练习题的详细解释: 1. 查询部门编号为30的所有员工信息: ```sql SELECT ename, job, mgr, hiredate, sal, comm,...
在Oracle数据库系统中,SQL(Structured Query Language)是用于管理和操作数据的核心工具。SQL语句的编写优化对于提升数据库性能至关重要,特别是在处理大量数据时。本资料“ORACLE数据库SQL语句编写优化总结”深入...
- **SELECT语句**:尽管基本语法相似,但Oracle支持特定的优化提示和集合运算符如START WITH和CONNECT BY,以及INTERSECT和MINUS,这些在Sql Server中需要通过其他方式实现,比如使用EXISTS和NOT EXISTS子句。...
Oracle SQL语句是数据库开发中的基础工具,它用于在Oracle数据库中进行数据查询、更新、删除等操作。本文主要探讨了几个重要的SQL概念和技术,包括`DISTINCT`、`NULL`处理、字符串连接以及`LIKE`操作符的使用。 1. ...
描述中提到了"在Oracle客户端目录下替换即可",这意味着如果oci.dll出现问题,可以采取以下步骤解决: 1. 首先,确定当前系统的位宽,是32位还是64位。 2. 根据系统位宽,从压缩包中选择相应的oci.dll文件(x64用于...
19. **避免在WHERE子句中使用NOT**:NOT可能导致ORACLE无法使用索引,应尽量避免。 20. **使用EXPLAIN PLAN**:分析查询执行计划,了解优化器如何处理SQL语句,找出性能瓶颈。 综上所述,Oracle SQL语句优化涉及表...