【问题标题】:Change join condition based on a condition - Oracle根据条件更改连接条件 - 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).

标签: sql oracle join


【解决方案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
    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多