下面两个SQL语句的执行结果有什么区别? (希望能从原理上加以解释,我认为最终执行结果应该一致)
哪个的执行效率会更高? 

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 

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)

解决方案 »

  1.   

    当 上面 两表内联接等于两表左外联接时,结果是一样
    否刚结果是不一样的
    用1语句  左边表所有记录会出现,除了 M.ondate is null 
    但2 语句 左边的记录只有符合where 条件才会出现在结果集里没说太清楚,不知道楼主能看明白不
      

  2.   

    如果用CBO,则执行效率一定完全一样,因为Oracle会对sql语句进行重写,将其改为效率最高的语句,所以效率是一样的。
    如果用RBO,则要看索引结构,数据量等信息,当然直接看执行计划最简单了。不过Oracle10g以后不再支持RBO了,也没必要进行对比了。
      

  3.   

    不一样,
    第一句左边全部的,右边只限制条件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 
    空值是不相互比较的;
      

  4.   


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

  5.   

    对于oracle来说,结果集是一样的,效率也没有区别.
      

  6.   

    跟人感觉一样
    简单的方法,看执行计划,或者set timing on 看两条语句的执行时间。
      

  7.   


    呵呵,兄弟,还是有区别的,不然就不会有SQL Tuning了吧!判断条件多的一方理论上效率要低些!
      

  8.   

    区别应该不大,oracle内部会自动优化.
      

  9.   

    存在返回记录数,由于存在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的条件列,无区别
    效率上也没有差别