我遇到了一个问题,我无法弄清楚如何正确配置联接。我正在使用报告软件,该软件利用我们 Oracle 数据库的 WHERE 子句中的 (+) 指标。我有两个表:
检查和交易。一张支票可以有多个交易,但一个交易不一定有对应的支票。
两个表都有标识当前记录的指示器,称为 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”语法来解释这一点:
选项1
SELECT *
FROM TXN
LEFT JOIN CHK
ON TXN.CHK_ID = CHK.CHK_ID
WHERE TXN.CURRENT = 'Y'
AND CHK.CURRENT = 'Y'
选项 2
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
工作?一个
LEFT JOIN
的想法是它将返回 JOIN
左侧的所有行表达式,无论另一侧是否有匹配的行,给定连接谓词。因此,在选项 2 中,无论您是否在 CHK
中找到一行与 CURRENT = 'Y'
为 TXN
中的一行,TXN
中的行仍然返回。这就是您在选项 2 中获得更多行的原因。此外,这个例子应该解释为什么你应该更喜欢“ANSI JOIN”语法。从维护/可读性的角度来看,您的查询正在做什么更加清晰。
关于sql - Oracle (+) 外连接和常量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34321872/