具有 OR 条件的 2 个表之间的 SQL 连接

Posted

技术标签:

【中文标题】具有 OR 条件的 2 个表之间的 SQL 连接【英文标题】:SQL join between 2 tables with OR condition 【发布时间】:2019-11-05 15:09:32 【问题描述】:

我只是想了解使用 OR 条件连接 2 个表背后的概念。 我的要求是:我需要在 Table1.colA = Table2.colB 列上加入 2 个表 Table1 [colA, colB] 和 Table2 [colX, colY] 但如果 colA 为 NULL,则条件应该是 Table1.colB = Table2.colY。

我需要单独加入它们然后再合并吗?或者有没有一种方法可以让我一次加入?请注意,我在两个表及其左连接中都有数百万条记录,并且这些表位于 HIVE 中。我没有可重复的例子,只是试图理解这个概念。

【问题讨论】:

您可能可以使用几个 case 语句,例如您的连接表达式可能是 on case when IsNull(colA) then colB else colA end = case when IsNull(colA) then colY else colX end 这可能会导致性能问题,但正如您所说,您有数百万条记录。 【参考方案1】:

虽然我不熟悉 HiveQL,但在 SQL Server 中,这可以通过以下方式完成:

SELECT *
FROM   table1 t1
       JOIN table2 t2
         ON COALESCE(t1.cola, t1.colb) = CASE
                                           WHEN t1.cola IS NULL THEN t2.coly
                                           ELSE t2.colx
                                         END  

逻辑应该是相当可读的。

【讨论】:

【参考方案2】:

直接翻译你的条件:

SELECT *
FROM table1 t1 JOIN
     table2 t2
     ON (t1.cola = t2.colb) or
        (t1.cola is null and t1.colb = t2.coly)

通常,orjoins 中的性能杀手。这通常使用两个单独的left joins 来表达:

SELECT . . . , COALESCE(t2a.col, t2b.col) as col
FROM table1 t1 LEFT JOIN
     table2 t2a
     ON (t1.cola = t2.colb) LEFT JOIN
     table2 t2b
     ON t1.cola is null and t1.colb = t2.coly;

【讨论】:

以上是关于具有 OR 条件的 2 个表之间的 SQL 连接的主要内容,如果未能解决你的问题,请参考以下文章

使用条件连接优化 SQL 查询

如何在 EF / EF Core 中的第二个表上实现具有某些条件的左连接?

SQL 连接 3 个表(基于 2 个条件?)

视图中四个表的 SQL Server 条件连接

Microsoft SQL 查询 - 从第二个表返回最后一条记录

mysql 最多可以查询多少条数据