【问题标题】:JOIN 2 tables with degrading conditionsJOIN 2 个具有降级条件的表
【发布时间】:2020-11-10 22:19:43
【问题描述】:

我必须通过几列加入 2 个表 (Oracle):AB

A.C1 = B.C1 
A.C2 = B.C2 

如果条件失败,那么我应该尝试以不那么苛刻的条件加入

A.C1 = B.C1

它对我有用吗:

SELECT a.*, b.* FROM A JOIN B ON 
   (A.C1 = B.C1 AND A.C2 = B.C2) OR (A.C1 = B.C1)

提前谢谢你!

【问题讨论】:

  • 您的查询等同于SELECT a.*, b.* FROM A JOIN B ON A.C1 = B.C1,因为另一个条件是该条件的子集。
  • @TonyAndrews - 还没有。 B 中可能有几条 A.C1 = B.C1 的记录,并且只有一条 A.C2 = B.C2。在这种情况下,我将获取这条记录。如果我将我的条件简化为 A.C1 = B.C1,那么我将获得所有提到的记录。我说的对吗?
  • 不,因为 OR 包含在内 - 您将获得 B 中的所有记录 A.C1 = B.C1 和一条记录 A.C1 = B.C1 AND A.C2 = B.C2,无论如何您都会得到!

标签: sql oracle join where-clause


【解决方案1】:

您可以使用两个左连接:

select a.*,
       coalesce(b.col, bdef.col)
from a left join
     b
     on a.c1 = b.c1 and a.c2 = b.c2 left join
     b bdef
     on a.c1 = bdef.c1 and b.c1 is null;

如果有两个都不匹配的情况,你可能需要where b.c1 is not null or bdef.c1 is not null——并且你想过滤掉它们。

【讨论】:

    【解决方案2】:

    一种方式:

    SELECT a.*, b.* 
      FROM A JOIN B ON 
        ON (A.C1 = B.C1 AND A.C2 = B.C2)
        OR (A.C1 = B.C1 AND NOT EXISTS(SELECT * FROM B
                                       WHERE (A.C1 = B.C1 AND A.C2 = B.C2)
                                      )
           )
    

    这应该确保如果有匹配的记录 (A.C1 = B.C1 AND A.C2 = B.C2),那么您不会得到任何“次优”记录,其中 (A.C1 = B.C1 AND A.C2 != B.C2)。

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 2020-08-24
      • 2013-11-20
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-09
      相关资源
      最近更新 更多