【问题标题】:SQL join between 2 tables with OR condition具有 OR 条件的 2 个表之间的 SQL 连接
【发布时间】: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 这可能会导致性能问题,但正如您所说,您有数百万条记录。

标签: sql hive hiveql


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多