JOIN 和 ON 子句(NULL 值)

Posted

技术标签:

【中文标题】JOIN 和 ON 子句(NULL 值)【英文标题】:JOIN and the ON clause (NULL values) 【发布时间】:2013-04-04 13:00:57 【问题描述】:

我有两张桌子

tableA (id,randomNumber) (2,1),(3,5),(3,2),(6,0),(8,0),...
tableB (id,randomNumber2) (0,2),(1,3),(2,0),(4,2)...

现在我想从两个表中获取 id、randomnumber 和 randomnumber2 where ID IN (0,1,2,3)。

所以应该返回:

(2,1), (3,5), (3,2), (0,2), (1,3), (2,0) 

我尝试了使用 JOIN 和 LEFT JOIN 的结构。

问题是当 ON 子句 (JOIN tableB b on a.id=b.id) 不为真时,它为 id 返回 NULL。但我还需要知道 NULL 值。例如对于 tableB,它会为第一个结果返回 (NULL,2)。

(2,1), (3,5), (3,2), (NULL,2), (NULL,3), (2,0) 

我怎样才能获得 NULL 值,我应该使用其他东西吗?

【问题讨论】:

【参考方案1】:

JOINs 用于表有相关数据时。在这里,两张桌子彼此无关。更好的选择是使用UNION

SELECT id, randomNumber
FROM tableA
WHERE ID IN (0,1,2,3)

UNION ALL

SELECT id, randomNumber2
FROM tableB
WHERE ID IN (0,1,2,3)

或者,只需使用 2 个单独的查询并组合结果。

【讨论】:

【参考方案2】:

您可以将UNION 与子查询一起使用:

SELECT id, rn
FROM (
    SELECT Id, randomNumber rn
    FROM tableA
    UNION
    SELECT Id, randomNumber2
    FROM tableB
) t
WHERE id IN (0,1,2,3)

如果您想要重复值,您可能需要使用UNION ALL

【讨论】:

这还会返回 randomNumber2 还是只返回 id 和 rn (randomNumber) ? @Nicolas -- 是的,这将返回带有相应 ID 的 randomNumber 和 randomNumber2 - 当然是 ID IN (0,1,2,3)。 我建议不要在这里使用子查询。它不会使用表上的索引。 @RocketHazmat -- 我完全同意,但有些东西告诉我该表结构,索引可能不存在 :) 我赞成你的答案! @sgeddes:是的。我不知道他的表结构。我也会给你一个赞成票:)

以上是关于JOIN 和 ON 子句(NULL 值)的主要内容,如果未能解决你的问题,请参考以下文章

不支持 Left Join On And 子句

LINQ Join 与 On 子句中的多个条件

JOIN 的 ON 子句中引用的表的顺序是不是重要?

merge into on条件能有Null判断嘛

如何在 LEFT JOIN ON 子句中使用子选择?

使用 JOIN 时的 WHERE 子句与 ON