`

sql中not in 改进方法

    博客分类:
  • SQL
阅读更多

前言:

今天在写一条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里的所有字段,条件是aaid值不在bbid值当中(not in)。也就是应该返回所有id为奇数的字段

 

使用NOT INSQL:

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字段和bbid,如果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

我们只需要idvalue两个字段,其他的就不要了。

结果

id  value

-------------------------

1     a        

3     c        

5           e        

 

ok,实现了,希望对大家有帮助。

分享到:
评论

相关推荐

    SQLServer Execpt和not in 性能区别

    在SQL Server中,`EXCEPT` 和 `NOT IN` 是两个用于查询数据的子句,它们都可以用来找出在一个集合中但不在另一个集合中的数据。然而,它们在性能方面可能存在显著的差异,尤其是在处理大量数据时。本文将深入探讨这...

    SQL性能改善及性能优化

    用NOT EXISTS替代NOT IN也是同样的道理,NOT EXISTS会在找到第一个不匹配的行后立即停止,而NOT IN则会遍历整个列表。 在适当情况下,用表连接替换EXISTS可以利用连接操作的并行性提高效率,但需谨慎,因为大型表的...

    在SQL Server中通过SQL语句实现分页查询

    ### 在SQL Server中通过SQL语句实现分页查询 #### 一、背景介绍 在数据库应用开发中,分页查询是一种常见的技术手段,用于改善用户体验并提高系统性能。特别是当数据量庞大时,一次性加载所有数据到前端不仅会导致...

    sql99规范文档

    6. 子查询和联接:SQL99引入了嵌套子查询,如`IN`, `NOT IN`, `ANY`, `SOME`和`ALL`子查询操作符,以及关联子查询。同时,支持自然连接(NATURAL JOIN)和自连接,使得数据查询更为灵活。 7. 规范化函数和集合函数...

    SQL2005的优化方法

    1. **操作符优化**:避免使用效率低的操作符,如IN/NOT IN,改为EXISTS/NOT EXISTS,用比较运算符替代IS NULL/IS NOT NULL。 2. **避免使用游标**:游标效率较低,尽量使用集合操作,如JOIN、子查询等。 3. **视图与...

    影响sql语句查询效率的因素

    通过合理处理NULL值、精确使用比较运算符、明智选择LIKE语句、谨慎使用`ORDER BY`子句以及优选`NOT EXISTS`而非`NOT IN`,可以显著提升查询效率,从而改善整体系统性能。在实践中,持续监控和调整查询策略,结合索引...

    sql server分页技术(SQL Server 与Access数据库相关分页技术)

    这种方法通过`TOP`关键字选取指定数量的记录,然后使用`NOT IN`子句排除已选取的记录。例如,查询第二页的记录,可以先选取前`@RecordStart`个主键,然后选取不在这些主键中的记录。这种方法简单但效率低,因为它...

    sql调优 sql调优

    例如,避免全表扫描,使用JOIN替代子查询,或者用IN代替NOT IN等。 4. **执行计划**:理解SQL语句的执行计划有助于找出潜在的性能问题。通过查看查询的执行计划,可以知道数据库如何解析查询,哪些索引被使用,以及...

    一般SQL语句优化整理

    对于一般的SQL语句优化,不仅能够提升查询效率,还能改善用户体验。本文将对一些常见的SQL语句优化技巧进行总结整理,帮助开发人员养成良好的SQL编写习惯。 #### SQL语句优化要点 ### 1. EXISTS与NOT EXISTS的使用...

    海量数据分页sql server经典

    本文将介绍几种在SQL Server中实现分页的有效方法,并着重讨论一种基于SQL查询优化的分页技术。 #### 传统分页方法及其局限性 - **ADO 记录集分页法**:这种方法利用ADO的内置功能实现分页。但是它存在明显的缺点...

    Oracle——sql语句优化

    本文将深入探讨几种常见的SQL操作符及其优化方法,包括IN、NOT IN、、IS NULL、>、<、LIKE以及UNION等,旨在帮助数据库管理员和开发人员构建更为高效、响应迅速的应用系统。 #### IN操作符:灵活性与性能的平衡 IN...

    oracle SQL语法大全

    在WHERE子句中,可以使用比较运算符(如=、<、>、、>=、)、逻辑运算符(AND、OR、NOT)以及 BETWEEN、IN、LIKE 和 IS NULL等特殊条件。 五、子查询 子查询是在SQL语句中嵌套的查询,可以返回单个值、多行单列或...

    sqlserver优化笔记

    - 避免在 `WHERE` 子句中使用 `IN`, `NOT IN`, `OR` 或 `HAVING`,可以考虑使用 `EXISTS` 或表连接代替。 **1.4 数据声明与Select语句** - **问题描述**:错误的数据声明或使用 `SELECT * FROM table` 可能导致...

    T-SQL编程入门(SQL Server)

    - 在 T-SQL 中,通配符主要用于 `LIKE` 子句中进行模糊匹配。 - `%`: 表示任意数量的字符。 - `_`: 表示单个字符。 #### 六、插入数据 (Inserting Data) - **注意事项**: - 在插入数据前需要确保数据类型与表...

    荐Sql server一些常见性能问题的解决方法

    标题中的“Sql server一些常见性能问题的解决方法”是指针对SQL Server数据库系统,在处理查询和数据操作时可能会遇到的性能瓶颈及其对应的优化策略。描述提到的文档详细记载了解决这些问题的方法,旨在帮助用户提高...

    sql语句优化技术分析

    SQL语句优化是数据库管理中的核心技能之一,它关乎到系统的性能、响应时间和资源利用率。在处理大量数据时,有效的SQL优化策略能显著提升数据库应用的效率。以下是对SQL语句优化技术的详细分析: 一、理解执行计划 ...

    SQL_Server_2008查询性能优化

    通过使用索引、WHERE子句的适当条件以及避免在JOIN操作中使用NOT IN或OR等低效运算符,可以减少全表扫描的发生。 在编写查询时,考虑使用参数化查询,这可以防止SQL注入,同时也有助于SQL Server重用执行计划,提高...

    sql语句的优化

    ### SQL语句优化详解 ...以上列举的方法涵盖了常见的优化策略,包括避免全表扫描、合理使用索引、改进查询方式等多个方面。希望这些技巧能够帮助初学者更好地理解和应用SQL优化技术,从而提高数据库的整体性能。

Global site tag (gtag.js) - Google Analytics