请教高手这几种写法有什么区别

ganningcn 2005-07-30 04:17:15
1.SELECT *
FROM RS_YGB
WHERE (NOT EXISTS
(SELECT oabh
FROM temp_rs_yg
WHERE oabh = rs_ygb.ygbh))
ORDER BY YGBH

2.SELECT *
FROM RS_YGB
WHERE (YGBH NOT IN
(SELECT oabh
FROM temp_rs_yg))
ORDER BY YGBH

3.SELECT *
FROM RS_YGB
WHERE (YGBH NOT IN
(SELECT oabh
FROM temp_rs_yg
WHERE oabh IS NOT NULL))
ORDER BY YGBH
本人测试1和3结果相同,请高人就效率和结果解疑
...全文
254 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjjf 2005-07-30
  • 打赏
  • 举报
回复
路过,听听各位的高见,呵呵
MorningTea 2005-07-30
  • 打赏
  • 举报
回复
NOT IN虽然比较符合我们的习惯,但是系统去编译的时候,会先转化为exists来执行,以前看到的

一篇文章,文摘我一下子找不到!用in,会先执行子查询(这样如果表的纪录多速度贼慢),然后将符

合条件的纪录列表放到一个临时表,然后再执行主查询!相对exists只管到where子句,我们知道我们

的纪录存储采取B-Tree结构,那么不必遍历整棵树就可以啦!这就是exists比in速度快来的原因!

select CityNam from CityInfo where Exists
(slect CityID from PPL where P_ID like '4418811983%' and CityInfo.CityID = PPL.CityID)
--这句只管到where,所以遍历CityInfo,只要找到一个CityID对应在表PPL中有P_ID like '4418811983%'就select 出来,否则就继续,没有next掉!

select CityNam from CityInfo where CityID in
(select CityID from PPL where P_ID like '4418811983%')
--这个语句,先执行子查询select CityID from PPL where P_ID like '4418811983%',所有的结果出来后,放在一个临时表(‘441881*****’,‘441881*****’,....,‘441881*****’)
然后才去执行主查询select CityNam from CityInfo,综合速度就比前面慢,然后才要去查询对应的
CityID是否存在(‘441881*****’,‘441881*****’,....,‘441881*****’)当中!

因此,使用EXISTS比使用IN通常查询速度快。大多数人会使用in,因为它比较容易编写,不过为了更好的效率还是改为用exists,如果是not in,也尽量改为用not exists,虽然两者都因为用了not(不能用索引而速度变慢),但是not exists 的效率也比not in来得高,如果not in('a','b',null)那么not in 失效,这个也是我们应该采用not exists的原因!

FYI~
hglhyy 2005-07-30
  • 打赏
  • 举报
回复
一般的来说 EXISTS 比用 IN 要快!
不过也要你的表够大!才能有明显的区别!邹大哥说的加上NULL值也是这个意思!(用大表测试)
ganningcn 2005-07-30
  • 打赏
  • 举报
回复
我知道第2种如果有null的记录,不会查出任何结果,如果去掉null的行,就会查出一些记录,只是不解,请讲明白些.
zjcxc 元老 2005-07-30
  • 打赏
  • 举报
回复
在 RS_YGB.ygbh 和 temp_rs_yg.oabh 中分别建立值为NULL的记录,你就可以测出区别了.
Frewin 2005-07-30
  • 打赏
  • 举报
回复
你可以将第二种方法改下
2.SELECT *
FROM RS_YGB
WHERE (YGBH NOT IN
(SELECT Isnull(oabh,0) --如果是字符型,就用Isnull(oabh,'')
FROM temp_rs_yg))
ORDER BY YGBH
Frewin 2005-07-30
  • 打赏
  • 举报
回复
因为如果oabh存在null
ganningcn 2005-07-30
  • 打赏
  • 举报
回复
to Frewin(江门工人)
为什么第二种得不到想要的结果?
Frewin 2005-07-30
  • 打赏
  • 举报
回复
,3两种方法没什么区别.执行效率听说第一种快.第二种中,如果表temp_rs_yg有空值oabh(即oabh存在null),则得不到想要结果.
Frewin 2005-07-30
  • 打赏
  • 举报
回复
1,3两种方法没什么区别.执行效率听说第一种快.第二种中,如果表temp_rs_yg用空值oabh,则得不到想要结果.

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧