最简单的说出in和exists的区别

[复制链接]
查看11 | 回复9 | 2008-1-11 01:05:02 | 显示全部楼层 |阅读模式
今天做了个操作
如果用in
delete from a where a.email in (select email from b)

exists呢? 很多人会写成这样:
delete from a where exists(select email from b)
本来想把a中包含b的email的字段都删除
结果可想,把a全都干掉了
exists的作用是判断的作用
我的语句相当与
delete from a whereexists(1=1)

将语句改为
delete from a where exists(select email from b where a.email=b.email)
就行了

简单易懂吧?
回复

使用道具 举报

千问 | 2008-1-11 01:05:02 | 显示全部楼层
呵呵,还行


回复

使用道具 举报

千问 | 2008-1-11 01:05:02 | 显示全部楼层
以前在学习SQL SERVER时一般选exists性能更佳
oracle中有两者有区别吗
回复

使用道具 举报

千问 | 2008-1-11 01:05:02 | 显示全部楼层
呵呵, 基础中的基础
回复

使用道具 举报

千问 | 2008-1-11 01:05:02 | 显示全部楼层
oracle中in和exists我觉得区别很大
算法也不一样
回复

使用道具 举报

千问 | 2008-1-11 01:05:02 | 显示全部楼层
用 in还是 exists 也不是绝对的
回复

使用道具 举报

千问 | 2008-1-11 01:05:02 | 显示全部楼层
在rbo下相对来说,用exists 比in好
在cbo下,那就不一定了
回复

使用道具 举报

千问 | 2008-1-11 01:05:02 | 显示全部楼层
1.select * from t1 where x in ( select y from t2 )
2. select * from t1 where exists ( select null from t2 where t1.x = t2.y )

如果子查询表 t2 的记录很多而t1的记录相对较少的话,建议采用第二种写法
如果t1的记录很多而t2的记录相对较少,则建议采用第一种写法。

当然最终还是要看 explain plan .
[ 本帖最后由 tolywang 于 2008-1-18 10:45 编辑 ]
回复

使用道具 举报

千问 | 2008-1-11 01:05:02 | 显示全部楼层
cbo下in自动使用band variables所以一般用in比较多吧
回复

使用道具 举报

千问 | 2008-1-11 01:05:02 | 显示全部楼层
这2者算法是不同的,所以适用的场景也不一样。
我记得Tom有写出过这2者的算法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行