根据条件更改连接条件 - 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的主要内容,如果未能解决你的问题,请参考以下文章