我发布这个问题是为了回应我最近在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
中有Base
个NULL
字段,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
子句,那么一切都按预期工作。
答案 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做了一些奇怪的事。