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】:JOIN
s 用于表有相关数据时。在这里,两张桌子彼此无关。更好的选择是使用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 值)的主要内容,如果未能解决你的问题,请参考以下文章