当前位置:  开发笔记 > 编程语言 > 正文

Oracle(+)外连接和常量值

如何解决《Oracle(+)外连接和常量值》经验,为你挑选了1个好方法。

我遇到了一个问题,我无法弄清楚如何正确配置连接.我正在使用报告软件,该软件利用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字段时额外的外连接指示符有什么影响.带有额外指标的查询会产生更大的结果集.有人可以帮助解释这里发生了什么吗?



1> Lukas Eder..:

我将通过使用等效的"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工作怎么样?

a的想法LEFT JOIN是,它将返回表达式LEFT侧的所有行JOIN,无论给定连接谓词在另一侧是否存在匹配的行.因此,在选择2,无论如果你发现一个行CHKCURRENT = 'Y'中连续TXN,在该行TXN仍返回.这就是您在选项2中获得更多行的原因.

此外,此示例应解释为什么您应该首选"ANSI JOIN"语法.从维护/可读性的角度来看,您的查询正在做什么要清楚得多.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有