根据条件更改连接条件 - Oracle

Posted

技术标签:

【中文标题】根据条件更改连接条件 - Oracle【英文标题】:Change join condition based on a condition - Oracle 【发布时间】:2015-09-26 12:20:02 【问题描述】:

假设我们有两张桌子。

TabA(Acol1,Acol2,Acol3)
TabB(Bcol1,Bcol2.Ccol3)

要求是,在 Acol1,Bcol1 上连接两个表,如果 Acol3='C',则除了上述连接外,还基于 Acol2=Bcol2 进行连接。我们可以在单个 SQL 查询中做到这一点吗?连接是记录方式还是表格方式?

我能得到的一个解决方案是使用 Union,但我认为这不是一个优化的解决方案。还有其他解决方案吗?

我想到的另一个解决方案

SELECT A.*,B.* FROM TabA A
         INNER JOIN TabB B ON A.Acol1 = B.BCol1 
         and case when A.Acol3='C' then A.ACol2 else '1' end = 
             case when A.Acol3='C' then B.BCol2 else '1' end ;

没有 case 和 Union 的任何其他解决方案?

提前致谢

【问题讨论】:

请编辑您的问题并提供示例数据和所需结果。目前尚不清楚您要做什么。 你能在你的加入中加入一个or,还是你想要更多?例如on (a.col1 = b.col1) and (a.col2 != 'C' or a.col2=b.col2). 【参考方案1】:

如果您只想在 TabA.col2 为“C”时加入它,那么在这种情况下,TabB.col2 也将是“C”,因为您已经从 col1 加入。所以你的输出将与你第一次加入时得到的相同。

 select a.*, b.* from tabA a join tabB b
 on a.col1=b.col1

这应该随时为您提供相同的输出。尝试在“C”的值上创建不同的场景。结果将始终是您的第一个连接结果的子集。

【讨论】:

【参考方案2】:

嗯,考虑过这个问题,我想你可能只是想要一个复杂的on 子句:

select a.*, b.*
from tabA a join
     tabB b
     on a.col1 = b.col1 and
        (a.col3 <> 'C' or a.col2 = b.col2);

注意:以上假设a.col2 不为空(如果需要,很容易包含该条件)。

您可能需要手动编写一些示例,以了解 or 方法等效于 case 语句。

【讨论】:

@Adriana 。 . .它本质上是相同的查询。只是on 条件从a.col2 更改为a.col3

以上是关于根据条件更改连接条件 - Oracle的主要内容,如果未能解决你的问题,请参考以下文章

linux系统笑着玩Oracle数据库多表查询

Oracle - 具有连接条件的外部连接

Oracle SQL 条件连接

Oracle SQL - 根据 current_date 更改 WHERE 条件

添加 2 表条件时,Oracle 左外连接停止返回结果

oracle 性能优化建议