left join顺序不同,竟然结果不同,会吗,如何解释?

人生无悔 2012-08-07 02:03:53
语句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在耍我们,呵呵,大家的意见呢
...全文
644 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sichen_1984 2012-08-09
  • 打赏
  • 举报
回复
SQL code
--贴出楼主的执行计划,大家分析分析,从目前看是由于内层是视图,oracle采取某种优化原则,出问题了。

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as gzjbkh

SQL>
SQL> select * from table(dbms_xplan.display_cursor('1z8y0c7zawd90'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID 1z8y0c7zawd90, child number 0
-------------------------------------
--语句1:select count(*) select /*sta 1*/ count(*) from v_gzjbwl_fund_amabzzpay a l
v_gzjbwl_fund_amabzzbankroll b on (a.member_code = b.member_code and a.fund_bill
b.fund_billnum and (b.dd_type_settlement <> '承兑汇票' or b.dd_type_settlement <> '商
b.fund_billnum is not null)
Plan hash value: 2069526587
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Co
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | |
| 1 | SORT AGGREGATE | | 1 | 74 |
| 2 | NESTED LOOPS OUTER | | 613 | 45362 |
|* 3 | HASH JOIN RIGHT OUTER | | 613 | 45362 |
| 4 | TABLE ACCESS FULL | FUND_ACCEPTANCE | 567 | 10773 |
|* 5 | HASH JOIN | | 613 | 33715 |
|* 6 | VIEW | index$_join$_009 | 544 | 15776 |
|* 7 | HASH JOIN | | | |
| 8 | INLIST ITERATOR | | | |
|* 9 | INDEX RANGE SCAN | IX_FUND_BANKROLL_1 | 544 | 15776 |
| 10 | INDEX FAST FULL SCAN | IX_FUND_BANKROLL | 544 | 15776 |
| 11 | TABLE ACCESS FULL | FUND_BANKROLL_DETAIL | 2480 | 64480 |
| 12 | VIEW | | 1 | |
|* 13 | FILTER | | | |
|* 14 | HASH JOIN OUTER | | 1 | 81 |
|* 15 | HASH JOIN | | 1 | 62 |
|* 16 | VIEW | index$_join$_004 | 366 | 10614 |
|* 17 | HASH JOIN | | | |
| 18 | INLIST ITERATOR | | | |
|* 19 | INDEX RANGE SCAN | IX_FUND_BANKROLL_1 | 366 | 10614 |
| 20 | INDEX FAST FULL SCAN| IX_FUND_BANKROLL | 366 | 10614 |
|* 21 | TABLE ACCESS FULL | FUND_BANKROLL_DETAIL | 1 | 33 |
| 22 | TABLE ACCESS FULL | FUND_ACCEPTANCE | 567 | 10773 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("B"."MEMBER_CODE"="C"."MEMBER_CODE" AND
"B"."BANKROLL_DETAIL_BILLNUM"="C"."ACCEPTANCE_BILLNUM")
5 - access("A"."BANKROLL_BILLCODE"="B"."BANKROLL_BILLCODE" AND
"A"."MEMBER_CODE"="B"."MEMBER_CODE")
6 - filter(("A"."BILLTYPE_CODE"='F004' OR "A"."BILLTYPE_CODE"='F005'))
7 - access(ROWID=ROWID)
9 - access(("A"."BILLTYPE_CODE"='F004' OR "A"."BILLTYPE_CODE"='F005'))
13 - filter("B"."BANKROLL_DETAIL_BILLNUM" IS NOT NULL)
14 - access("B"."MEMBER_CODE"="C"."MEMBER_CODE" AND
"B"."BANKROLL_DETAIL_BILLNUM"="C"."ACCEPTANCE_BILLNUM")
15 - access("A"."BANKROLL_BILLCODE"="B"."BANKROLL_BILLCODE" AND
"A"."MEMBER_CODE"="B"."MEMBER_CODE")
16 - filter("B"."BANKROLL_DETAIL_BILLNUM" IS NOT NULL)
17 - access(ROWID=ROWID)
19 - access(("A"."BILLTYPE_CODE"='F002' OR "A"."BILLTYPE_CODE"='F003'))
21 - filter("B"."BANKROLL_DETAIL_BILLNUM" IS NOT NULL)

57 rows selected
SQL> select * from table(dbms_xplan.display_cursor('bjkfpps0pdrcw'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
SQL_ID bjkfpps0pdrcw, child number 0
-------------------------------------
--语句2: select /*sta 2*/ count(*) from v_gzjbwl_fund_amabzzpay a left join
v_gzjbwl_fund_amabzzbankroll b on ( (b.dd_type_settlement <> '承兑汇票' or b.dd_typ
'商业承兑汇票') and a.member_code = b.member_code and a.fund_billnum = b.fund_billnum
b.fund_billnum is not null)
Plan hash value: 1377215601
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | |
| 1 | SORT AGGREGATE | | 1 | 74
| 2 | NESTED LOOPS OUTER | | 613 | 45362
|* 3 | HASH JOIN RIGHT OUTER | | 613 | 45362
| 4 | TABLE ACCESS FULL | FUND_ACCEPTANCE | 567 | 10773
|* 5 | HASH JOIN | | 613 | 33715
|* 6 | VIEW | index$_join$_009 | 544 | 15776
|* 7 | HASH JOIN | | |
| 8 | INLIST ITERATOR | | |
|* 9 | INDEX RANGE SCAN | IX_FUND_BANKROLL_1 | 544 | 15776
| 10 | INDEX FAST FULL SCAN | IX_FUND_BANKROLL | 544 | 15776
| 11 | TABLE ACCESS FULL | FUND_BANKROLL_DETAIL | 2480 | 64480
| 12 | VIEW | | 1 |
|* 13 | HASH JOIN OUTER | | 1 | 81
| 14 | NESTED LOOPS | | 1 | 62
|* 15 | TABLE ACCESS FULL | FUND_BANKROLL_DETAIL | 1 | 33
|* 16 | TABLE ACCESS BY INDEX ROWID| FUND_BANKROLL | 1 | 29
|* 17 | INDEX UNIQUE SCAN | IX_FUND_BANKROLL | 1 |
| 18 | TABLE ACCESS FULL | FUND_ACCEPTANCE | 567 | 10773
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("B"."MEMBER_CODE"="C"."MEMBER_CODE" AND
"B"."BANKROLL_DETAIL_BILLNUM"="C"."ACCEPTANCE_BILLNUM")
5 - access("A"."BANKROLL_BILLCODE"="B"."BANKROLL_BILLCODE" AND
"A"."MEMBER_CODE"="B"."MEMBER_CODE")
6 - filter(("A"."BILLTYPE_CODE"='F004' OR "A"."BILLTYPE_CODE"='F005'))
7 - access(ROWID=ROWID)
9 - access(("A"."BILLTYPE_CODE"='F004' OR "A"."BILLTYPE_CODE"='F005'))
13 - access("B"."MEMBER_CODE"="C"."MEMBER_CODE" AND
"B"."BANKROLL_DETAIL_BILLNUM"="C"."ACCEPTANCE_BILLNUM")
15 - filter(("B"."BANKROLL_DETAIL_BILLNUM" IS NOT NULL AND
"B"."BANKROLL_DETAIL_BILLNUM"="B"."BANKROLL_DETAIL_BILLNUM" AND
("B"."DD_TYPE_SETTLEMENT"<>'商业承兑汇票' OR "B"."DD_TYPE_SETTLEMENT"<>'
16 - filter(("A"."BILLTYPE_CODE"='F002' OR "A"."BILLTYPE_CODE"='F003'))
17 - access("A"."MEMBER_CODE"="B"."MEMBER_CODE" AND
"A"."BANKROLL_BILLCODE"="B"."BANKROLL_BILLCODE")
filter("A"."MEMBER_CODE"="A"."MEMBER_CODE")

53 rows selected
人生无悔 2012-08-07
  • 打赏
  • 举报
回复
谢谢大家,意见一致就好,呵呵
Barton 2012-08-07
  • 打赏
  • 举报
回复
没区别
天-笑 2012-08-07
  • 打赏
  • 举报
回复
这样的事 真有点奇葩!!!
理论上应该是一样的
人生无悔 2012-08-07
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20120807/10/7577e13a-387f-49a3-ac12-16c156a7ffd5.html?48996

这是原帖

如果真搞出这样的例子,另送400技术分吧,毕竟大家的时间保贵,呵呵

它只有一个left join什么都没有,实在不信会差这么大,呵呵
Mr_Nice 2012-08-07
  • 打赏
  • 举报
回复
光看这语句,应该不会查询出来不同吧!

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

筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

如果后面的and 中有一个and改成where 结果集数据会发生变化的。
[/Quote]
问题是她没有改成where
--小F-- 2012-08-07
  • 打赏
  • 举报
回复
ORACLE的毕竟不懂 不妄加评论
  • 打赏
  • 举报
回复
我刚才在SQL SERVER里作了个测试,如果把不表A或表B单方的条件加到left join的on里,对结果没有影响,不知道ORACLE里的是怎样。
建议还是把单方的条件放到where里比较保险
叶子 2012-08-07
  • 打赏
  • 举报
回复
如果后面的and 中有一个and改成where 结果集数据会发生变化的。
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

我没库,也没看他在库中执行,只是问了他下,呵呵,他说这样的结果,同个库执行的,表示非常怀疑
[/Quote]

你可以模拟一个出来哈
叶子 2012-08-07
  • 打赏
  • 举报
回复

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);

如果是同一个目标库的话,结果应该是一样的。
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
v_gzjbwl_fund_amabzzpay 这个看名字是个想个视图


不管它是不是视图,

我都坚信 只改变条件顺序 对结果是没有任何印象的。
人生无悔 2012-08-07
  • 打赏
  • 举报
回复
我没库,也没看他在库中执行,只是问了他下,呵呵,他说这样的结果,同个库执行的,表示非常怀疑
筱筱澄 2012-08-07
  • 打赏
  • 举报
回复
你试出来不一样了?

我看多半是运行错库了

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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