日期:2014-05-18  浏览次数:20941 次

left join顺序不同,竟然结果不同,会吗,如何解释?
语句1:select count(*)
from v_gzjbwl_fund_amabzzpay a
left join v_gzjbwl_fund_amabzzbankroll b on (a.member_code = b.member_code and a.fund_billnum = b.fund_billnum
and (b.dd_type_settlement <> '承兑汇票' or b.dd_type_settlement <> '商业承兑汇票')
and b.fund_billnum is not null);

语句2:
select count(*)
from v_gzjbwl_fund_amabzzpay a
left join v_gzjbwl_fund_amabzzbankroll b on (
 (b.dd_type_settlement <> '承兑汇票' or b.dd_type_settlement <> '商业承兑汇票') and
a.member_code = b.member_code and a.fund_billnum = b.fund_billnum
and b.fund_billnum is not null);

结果分别为:
906040
822


这是oracle版块中的一个题目,想不通,以为lz在耍我们,呵呵,大家的意见呢

------解决方案--------------------
你试出来不一样了?

我看多半是运行错库了
------解决方案--------------------
SQL code

select count(*)
from v_gzjbwl_fund_amabzzpay a left join v_gzjbwl_fund_amabzzbankroll b 
on 
(a.member_code = b.member_code 
and a.fund_billnum = b.fund_billnum
and (b.dd_type_settlement <> '承兑汇票' or b.dd_type_settlement <> '商业承兑汇票')
and b.fund_billnum is not null);

select count(*)
from v_gzjbwl_fund_amabzzpay a left join v_gzjbwl_fund_amabzzbankroll b 
on 
((b.dd_type_settlement <> '承兑汇票' or b.dd_type_settlement <> '商业承兑汇票') 
and a.member_code = b.member_code 
and a.fund_billnum = b.fund_billnum
and b.fund_billnum is not null);

------解决方案--------------------
我刚才在SQL SERVER里作了个测试,如果把不表A或表B单方的条件加到left join的on里,对结果没有影响,不知道ORACLE里的是怎样。
建议还是把单方的条件放到where里比较保险
------解决方案--------------------
ORACLE的毕竟不懂 不妄加评论
------解决方案--------------------
光看这语句,应该不会查询出来不同吧!

貌似原来的LZ想说的是not in 三值逻辑中null的问题。
可这两个语句,如果给出结构的话,可以看到执行计划是一样的啊。


------解决方案--------------------
这样的事 真有点奇葩!!!
理论上应该是一样的
------解决方案--------------------
没区别