当前位置: 代码迷 >> Sql Server >> left join顺序不同,竟然结果不同,会吗,怎么解释
  详细解决方案

left join顺序不同,竟然结果不同,会吗,怎么解释

热度:31   发布时间:2016-04-27 11:40:01.0
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_billnumand (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_billnumand b.fund_billnum is not null);
------解决方案--------------------
我刚才在SQL SERVER里作了个测试,如果把不表A或表B单方的条件加到left join的on里,对结果没有影响,不知道ORACLE里的是怎样。
建议还是把单方的条件放到where里比较保险
------解决方案--------------------
ORACLE的毕竟不懂 不妄加评论
------解决方案--------------------
光看这语句,应该不会查询出来不同吧!

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


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