sql - Oracle (+) 外连接和常量值

标签 sql oracle left-join

我遇到了一个问题,我无法弄清楚如何正确配置联接。我正在使用报告软件,该软件利用我们 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/

相关文章:

php - MySQL Left Join with WHERE 和 Greater than

sql - named_scope 按最后评论日期排序帖子

mysql - 从 SQL Server 存储过程调用 MySQL 存储过程/查询

MySQL选择重复值中的一个字段

python - 传递 python list oracle where 子句 cx_Oracle

sql - 为两个表之间的公共(public)行添加标志

sql - LEFT OUTER JOIN 只返回第一个匹配项

mysql - 由于未使用内连接,选择速度较慢

c# - 如何使用 Entity Framework 使用序列在 Oracle 中插入标识值

sql - Redshift 左外连接忽略空值