我遇到了一个问题,我无法弄清楚如何正确配置连接.我正在使用报告软件,该软件利用WHERE子句中的(+)指标为我们的Oracle数据库.我有两张桌子:
检查和交易.检查可以有多个事务,但事务不一定有相应的检查.
两个表都有指示器,用于标识名为CURRENT的当前记录,即"Y"或"N".
加入选项1:
Select * FROM TXN,CHK WHERE TXN.CHK_ID = CHK.CHK_ID(+) and TXN.CURRENT = 'Y' and CHK.CURRENT = 'Y'
加入选项2:
Select * FROM TXN,CHK WHERE TXN.CHK_ID = CHK.CHK_ID(+) and TXN.CURRENT = 'Y' and CHK.CURRENT(+) = 'Y'
这些连接产生不同的结果,我似乎无法弄清楚当应用于CHK.CURRENT字段时额外的外连接指示符有什么影响.带有额外指标的查询会产生更大的结果集.有人可以帮助解释这里发生了什么吗?
我将通过使用等效的"ANSI JOIN"语法来解释这一点:
SELECT * FROM TXN LEFT JOIN CHK ON TXN.CHK_ID = CHK.CHK_ID WHERE TXN.CURRENT = 'Y' AND CHK.CURRENT = 'Y'
SELECT * FROM TXN LEFT JOIN CHK ON TXN.CHK_ID = CHK.CHK_ID AND CHK.CURRENT = 'Y' WHERE TXN.CURRENT = 'Y'
正如你所看到的,选项1,应用于你的不变谓词后的LEFT JOIN
指定表表达式,即对的结果LEFT JOIN
.
在选项2中,您的一个常量谓词是LEFT JOIN
表达式的一部分.
LEFT JOIN
工作怎么样?a的想法LEFT JOIN
是,它将返回表达式LEFT侧的所有行JOIN
,无论给定连接谓词在另一侧是否存在匹配的行.因此,在选择2,无论如果你发现一个行CHK
与CURRENT = 'Y'
中连续TXN
,在该行TXN
仍返回.这就是您在选项2中获得更多行的原因.
此外,此示例应解释为什么您应该首选"ANSI JOIN"语法.从维护/可读性的角度来看,您的查询正在做什么要清楚得多.