首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于条件更改联接条件- Oracle

基于条件更改联接条件- Oracle
EN

Stack Overflow用户
提问于 2015-09-26 20:20:03
回答 2查看 484关注 0票数 1

假设我们有两张表。

代码语言:javascript
运行
复制
TabA(Acol1,Acol2,Acol3)
TabB(Bcol1,Bcol2.Ccol3)

要求类似于,连接Acol1上的两个表,Bcol1和if Acol3='C‘,那么除了上面的连接之外,还可以基于Acol2=Bcol2进行连接。我们能在单个SQL查询中实现吗?join是按记录操作还是按表操作?

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

我想到了另一个解决方案

代码语言:javascript
运行
复制
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的其他解决方案吗?

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2015-09-26 20:22:04

嗯,在考虑了这个问题之后,我想你可能只需要一个复杂的on子句:

代码语言:javascript
运行
复制
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不是null (如果需要,很容易包含该条件)。

您可能需要手动计算出一些示例,才能看到or方法与case语句等效。

票数 0
EN

Stack Overflow用户

发布于 2015-09-26 20:35:13

如果您只想在TabA.col2上加入'C',那么在这些情况下,TabB.col2也将是'C‘,因为您已经从col1加入了。因此,您的输出将与您通过第一次连接得到的输出相同。

代码语言:javascript
运行
复制
 select a.*, b.* from tabA a join tabB b
 on a.col1=b.col1

这将在任何时候为您提供相同的输出。尝试在“C”的值上创建一个不同的方案。结果将始终是第一个join结果的子集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32797117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档