共计 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 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!