Oracle表连接的奇怪问题

作者在制作计费报表时因脚本错误发现数据库查询中一个奇怪的问题:原本应为左连接的查询意外变为自然连接,导致结果集异常扩大。通过检查发现是连接条件书写错误所致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 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的那段脚本执行计划和下面的大同小异

  
希望各位高手多多指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值