SQL左联接中的奇怪行为

SQL左联接中的奇怪行为,sql,left-join,coalesce,Sql,Left Join,Coalesce,我发布这个问题是为了回应我最近写的答案。问题涉及两个表格: 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而缺失的字段None表示ID出现在Base中,带有NULL字段,而NULL表示我们在Base中根本看不到ID。我认为以下查询(

我发布这个问题是为了回应我最近写的答案。问题涉及两个表格:

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
而缺失的字段
None
表示
ID
出现在
Base
中,带有
NULL
字段,而
NULL
表示我们在
Base
中根本看不到
ID
。我认为以下查询(适用于ANSI SQL)可以工作:

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
D
ID都将
None
作为报告的新字段。我本以为只有
D
才有
None
,而
C
应报告为
NULL

有人能解释一下吗?更奇怪的是,如果我在上面的查询/演示中删除了orderby子句,那么一切都会正常工作


在线编译器版本中可能存在问题

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;
因为 给出了我们期望的准确结果


而且他们会做一些奇怪的事情。

这似乎是一个错误。@GordonLinoff是的……这是我的感觉。你能确认我的查询应该产生预期的结果,忽略bug吗?我问是因为我不想在这里发布任何错误信息。即使不测试查询,添加
order by
也不会改变返回的行集。句号<代码>排序依据应仅影响顺序,而不影响行的内容。@TimBiegeleisen。。。与这些在线演示工具相比,您能在实际的DBMS中确认这种行为吗?嗨,Dinesh,这不会,因为您的查询无法区分这两种类型的缺失值。在任何情况下,我的问题主要是试图使原始查询正常工作,而不是使用变通方法。在您的问题中,Id D的字段为空“”,但您将值插入为NULL,我不理解这个问题。很抱歉,在
Base
表中
D
有一个
NULL
字段值,而不是空字符串。我知道你的查询是从哪里来的了。@TimBiegeleisen,同样的查询在中给出了预期的结果,在中给出了奇怪的结果。