怎么在sql语句中替换Not In方法

57次阅读
没有评论

共计 1593 个字符,预计需要花费 4 分钟才能阅读完成。

本篇内容主要讲解“怎么在 sql 语句中替换 Not In 方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“怎么在 sql 语句中替换 Not In 方法”吧!

目的:

替换 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,实现了,希望对大家有帮助。

到此,相信大家对“怎么在 sql 语句中替换 Not In 方法”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计1593字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)