具有 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)
通常,or
是join
s 中的性能杀手。这通常使用两个单独的left join
s 来表达:
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 连接的主要内容,如果未能解决你的问题,请参考以下文章
如何在 EF / EF Core 中的第二个表上实现具有某些条件的左连接?