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

时间:2015-09-26 12:20:03

标签: sql oracle join

假设我们有两个表。

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 ;

没有案例和联盟的任何其他解决方案?

提前致谢

2 个答案:

答案 0 :(得分:0)

嗯,在考虑了这个问题之后,我想你可能只想要一个复杂的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语句。

答案 1 :(得分:0)

如果您想加入TabA.col2,只有在C&#39; C&#39;那么在这种情况下,TabB.col2也将是&#39; C&#39;,因为你已经从col1加入了。因此,您的输出将与第一次加入时的输出相同。

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

这应该随时给你相同的输出。尝试在&#39; C&#39;的值上创建不同的场景。结果将始终是您第一次加入结果的子集。