关于SQL语句提问。

angowb 2009-03-02 04:36:48
下面两个SQL语句的执行结果有什么区别? (希望能从原理上加以解释,我认为最终执行结果应该一致)
哪个的执行效率会更高?
1
select uniqueNumber from His H left outer join Mth M on H.ondate = M.ondate and H.sno = M.sno and(M.mcode = 100 or M.mcode = 200 or m.mcode = 300)
where M.ondate is null
2
select uniqueNumber from His H left outer join Mth M on H.ondate = M.ondate and H.sno = M.sno where M.ondate is null
and(M.mcode = 100 or M.mcode = 200 or m.mcode = 300)
...全文
162 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiao1984 2009-03-07
  • 打赏
  • 举报
回复
存在返回记录数,由于存在left join条件H.ondate = M.ondate 和最后结果集筛选条件M.ondate is null,导致导致结果集和inner join的一致(H inner join M, 不再需要M.ondate is null),所以两个SQL就等价于:

1
select uniqueNumber from His H inner join Mth M on H.ondate = M.ondate and H.sno = M.sno and(M.mcode = 100 or M.mcode = 200 or m.mcode = 300)

2
select uniqueNumber from His H inner join Mth M on H.ondate = M.ondate and H.sno = M.sno where (M.mcode = 100 or M.mcode = 200 or m.mcode = 300)

inner join 的时候where 条件列都可以算作inner join的条件列,无区别


效率上也没有差别
mike_24 2009-03-07
  • 打赏
  • 举报
回复
区别应该不大,oracle内部会自动优化.
wanglei8 2009-03-04
  • 打赏
  • 举报
回复
我认为第一条效率更高一些,因为在关联的时候就进行了条件过滤,所以操作的结果集比较少
angowb 2009-03-04
  • 打赏
  • 举报
回复
顶一下
oraclelogan 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oracledbalgtu 的回复:]
对于oracle来说,结果集是一样的,效率也没有区别.


引用楼主 angowb 的帖子:
下面两个SQL语句的执行结果有什么区别? (希望能从原理上加以解释,我认为最终执行结果应该一致)
哪个的执行效率会更高?
1
select uniqueNumber from His H left outer join Mth M on H.ondate = M.ondate and H.sno = M.sno and(M.mcode = 100 or M.mcode = 200 or m.mcode = 300)
where M.ondate is null
2
select uniqueNumber f…
[/Quote]

呵呵,兄弟,还是有区别的,不然就不会有SQL Tuning了吧!

判断条件多的一方理论上效率要低些!
niuxinlong 2009-03-03
  • 打赏
  • 举报
回复
帮顶一下
jdsnhan 2009-03-03
  • 打赏
  • 举报
回复
跟人感觉一样
简单的方法,看执行计划,或者set timing on 看两条语句的执行时间。
oracledbalgtu 2009-03-03
  • 打赏
  • 举报
回复
对于oracle来说,结果集是一样的,效率也没有区别.


[Quote=引用楼主 angowb 的帖子:]
下面两个SQL语句的执行结果有什么区别? (希望能从原理上加以解释,我认为最终执行结果应该一致)
哪个的执行效率会更高?
1
select uniqueNumber from His H left outer join Mth M on H.ondate = M.ondate and H.sno = M.sno and(M.mcode = 100 or M.mcode = 200 or m.mcode = 300)
where M.ondate is null
2
select uniqueNumber from His H left outer join Mth M on H.ondate = M.ondate and H.sno = M.sno wher…
[/Quote]
jlj84237485 2009-03-03
  • 打赏
  • 举报
回复
帮顶一下
angowb 2009-03-03
  • 打赏
  • 举报
回复
继续,
请问是否在左外连接中对右表的限制条件都不会对连接结果产生影响。
反之,
是否在右外连接中对左表的限制条件都不会对连接结果产生影响。
angowb 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hdhai9451 的回复:]
不一样,
第一句左边全部的,右边只限制条件M.ondate is null
第二句左边全部的,但右边限制条件M.ondate is null and (M.mcode = 100 or M.mcode = 200 or m.mcode = 300),多了括号里的条件,左边的数据会过滤更多

[/Quote]

请问,第一句中的连接条件中,下面对右表的and条件是否对左外连接不产生任何限制?
and(M.mcode = 100 or M.mcode = 200 or m.mcode = 300)

请您指导,非常感谢!!!
angowb 2009-03-03
  • 打赏
  • 举报
回复
自己顶一下。
Andy__Huang 2009-03-02
  • 打赏
  • 举报
回复
不一样,
第一句左边全部的,右边只限制条件M.ondate is null
第二句左边全部的,但右边限制条件M.ondate is null and (M.mcode = 100 or M.mcode = 200 or m.mcode = 300),多了括号里的条件,左边的数据会过滤更多


但我又看条件为M.ondate is null
这两条查询语句的查询结果应该是一条记录都没有;
为什么呢?
因为已经有条件M.ondate is null 限制了,而连接的时候又存在H.ondate = M.ondate
空值是不相互比较的;
fuyou001 2009-03-02
  • 打赏
  • 举报
回复
两位前辈讨论下结果集是否相同
dawugui 2009-03-02
  • 打赏
  • 举报
回复
我看都差不多.
zcs_1 2009-03-02
  • 打赏
  • 举报
回复
如果用CBO,则执行效率一定完全一样,因为Oracle会对sql语句进行重写,将其改为效率最高的语句,所以效率是一样的。
如果用RBO,则要看索引结构,数据量等信息,当然直接看执行计划最简单了。不过Oracle10g以后不再支持RBO了,也没必要进行对比了。
fuyou001 2009-03-02
  • 打赏
  • 举报
回复
当 上面 两表内联接等于两表左外联接时,结果是一样
否刚结果是不一样的


用1语句 左边表所有记录会出现,除了 M.ondate is null
但2 语句 左边的记录只有符合where 条件才会出现在结果集里

没说太清楚,不知道楼主能看明白不

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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