SQL左连接中的奇怪行为

时间:2018-01-11 02:40:00

标签: sql left-join coalesce

我发布这个问题是为了回应我最近在this question上写的回答。问题涉及两个表:

Base:
ID  Field
A   1
B   2
D   NULL

Join:
ID
A
B
C
D

这是所需的输出:

Output:
ID  Newfield
A   1
B   2
C   NULL
D   None

换句话说,我们希望区分由于Base中缺少值而丢失的字段,以及因为它们甚至没有ID出现Base而丢失的字段。 None表示ID中有BaseNULL字段,NULL表示我们甚至没有看到ID { {1}}。我认为以下查询(适用于ANSI SQL)可以工作:

Base

然而,正如您在下面的演示中所看到的,SELECT t1.ID, t2.Newfield, t2.ID FROM `Join` t1 LEFT JOIN ( SELECT ID, COALESCE(Field, 'None') AS Newfield, Field FROM Base ) t2 ON t1.ID = t2.ID ORDER BY t1.ID; C ID都有D作为报告的新字段。我原本希望None单独D,而None应报告为C

有人可以解释一下吗?为了使这更奇怪,如果我删除上述查询/演示中的NULL子句,那么一切都按预期工作。

Demo

1 个答案:

答案 0 :(得分:0)

可能是在线编译器版本中的问题。

SELECT t1.ID, t2.Newfield
FROM `Join` t1
LEFT JOIN
(
    SELECT ID, IFNULL(Field, 'None') AS Newfield, Field
    FROM Base
) t2
    ON t1.ID = t2.ID
ORDER BY t1.ID;

因为 my previous answer给出了我们预期的确切结果。

SQL Fiddle做了一些奇怪的事。