Oracle表连接的奇怪问题

简介:
 今天在做计费报表的时候,由于粗心,拿数据的的脚本给写错了,却让我发现了一个很奇怪的问题,下面来让我介绍我发现的这个问题:数据库有表

 CHARGE_REF , CLIENT_INVOICE CLIENT_INVHDR。其中CHARGE_REF表是保存的收费类型的数据;CLIENT_INVHDR表保存的是发票头部信息,CLIENT_INVOICE表保存的是发票的详细信息,大体如下图所示
 


我当时拿数据的时候的脚本大体是这样的(这里做了简化处理)
SELECT C.CDESCPT, I.CNTR, I.AMOUNT, I.CHARGE_CODE
FROM CLIENT_INVHDR H
LEFT JOIN CLIENT_INVOICE I ON I.INVOICE_NO = H.INVOICE_NO
LEFT JOIN CHARGE_REF C ON I.CHARGE_CODE = I.CHARGE_CODE
 WHERE (0 = 0)
    AND I.status = 'C'
    AND H.INVOICE_NO = 'A09000074'
红色的部分即是我粗心写错的地方,结果当时发现这段脚本执行不正确,当时也没有发现自己的错误,很是郁闷,发现它不是和
CHARGE_REF 左连接,而是做了自然连接。CHARGE_REF表有42种收费类型,而CLIENT_INVOICE INVOICE_NO 为'A09000074' 的记录刚好为15,所以查询出来的记录是630。 


当时正反迷糊,以为是左连接的问题,于是改了改脚本,结果发现和上面的脚本执行结果一样。如图所示   
真是纳闷,仔细检查了下代码,突然发现是LEFT JOIN CHARGE_REF C ON I.CHARGE_CODE = I.CHARGE_CODE
这 里连接条件的问题,很纳闷为什么在PL/SQL里表连接条件出错的时候,也能正常执行(望高手指点一二,小弟感激不尽),而且我猜测由于这个链接条件没起 作用后,它默认使用了自然连接。运行F5后发现结果如下图,使用LEFT JOIN的那段脚本执行计划和下面的大同小异

  
希望各位高手多多指教!

相关文章
|
SQL Oracle 关系型数据库
Oracle表连接
Oracle表连接
79 0
|
SQL Oracle 关系型数据库
Oracle中的分组查询、子查询、多表连接
Oracle中的分组查询、子查询、多表连接
224 0
Oracle中的分组查询、子查询、多表连接
|
SQL Oracle 关系型数据库
Oracle SQL优化之多表连接
Oracle SQL优化之多表连接
443 0
Oracle SQL优化之多表连接
|
SQL 存储 Oracle
Oracle之3种表连接方式(排序合并连接、嵌套循环、哈希连接)
Oracle之3种表连接方式(排序合并连接、嵌套循环、哈希连接) 排序合并连接 1.2.4.2.1  排序合并连接 排序合并连接(Sort Merge Join)是一种两个表在做表连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的表连接方法。
2970 0
|
Oracle 关系型数据库 索引
Oracle优化之表连接方式
Oracle优化之表连接方式在Oracle数据库中,两个表之间的表连接方法有排序合并连接、嵌套循环连接、哈希连接和笛卡尔连接四种 1.排序合并连接(sort merge join)   排序合并连接是一种两表在做表连接时用排序(SORT)操作和合并(MERGE)操作来得到连接结果集的表连接方法  ...
1320 0
|
SQL Oracle 关系型数据库
Oracle中表连接方式(Nested Loop、Hash join)对于表访问次数的测试
介绍了sql多表连接的几种方式,如有不正确的地方请指正。
4259 0
|
Oracle 关系型数据库 索引
|
SQL Oracle 关系型数据库