posts - 25, comments - 69, trackbacks - 0, articles - 2
select * from a,b where a.id=b.id(+);
select * from a left join b on a.id=b.id;

很多资料说上面两个语句的效果是一样的,实际上今天经过测试发现两者的执行计划大不相同(查询结果是一样的);
至于为什么会这样,暂时没有深究,手头的一个例子表明按照第一种写法的效率会高,或许其他的例子结果不一样,等有时间的时候再测试一下吧.

Feedback

# re: oracle 的left join和(+)真的可以起到一样的效果吗?  回复  更多评论   

2007-12-14 10:11 by hao ren
是的,我也发现了这个问题。
因为速度的原因,差点搞死我!
不得已又换成了+号,
速度居然有两倍的差距!!
要是你有什么好的资料或结果的话,
请告诉我一声,谢谢。
wang20yin@126.com

# re: oracle 的left join和(+)真的可以起到一样的效果吗?  回复  更多评论   

2008-09-16 11:59 by Noodle
学习,呵呵

# re: oracle 的left join和(+)真的可以起到一样的效果吗?[未登录]  回复  更多评论   

2008-10-06 14:44 by null
把不同的执行计划贴出来看看啊。

# re: oracle 的left join和(+)真的可以起到一样的效果吗?[未登录]  回复  更多评论   

2009-01-19 12:17 by aa
select * from a,b where a.id=b.id(+) and a.flg = '0';
select * from a left join b on a.id=b.id and a.flg = '0';

条件追加:
-〉and a.flg = '0'

你看一下区别吧!

处理方法:
select * from a left join b on a.id=b.id and a.flg = '0';
同下!
select * from a ,b where a.id=b.id and (a.flg = '0' or a.flg is null);


# re: oracle 的left join和(+)真的可以起到一样的效果吗?  回复  更多评论   

2010-04-01 18:02 by feiyvefanli
这个是版本问题 好像9i以后 才增加的left join 以前都是使用(+)
后续版本向下兼容 所以9i之后 这两者是通用的 但建议使用left jion增加可读性

# re: oracle 的left join和(+)真的可以起到一样的效果吗?[未登录]  回复  更多评论   

2011-05-12 09:58 by AA
@aa

select * from a,b where a.id=b.id(+) and a.flg = '0';
select * from a left join b on a.id=b.id and a.flg = '0';
这两个不对等,
把第一个修改一下
select * from a,b where a.id=b.id(+) and a.flg(+) = '0';
这样 就和
select * from a left join b on a.id=b.id and a.flg = '0';
对等了

# re: oracle 的left join和(+)真的可以起到一样的效果吗?[未登录]  回复  更多评论   

2011-07-19 09:53 by feng
oracle 在解析的时候会把left join right join 都转换成+
如果你写sql的时候都是用+就少了转换

只有注册用户登录后才能发表评论。


网站导航: