【发布时间】:2018-01-11 02:39:59
【问题描述】:
我发布这个问题是为了回应我最近在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 表示我们甚至根本没有在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。
有人能解释一下吗?更奇怪的是,如果我在上面的查询/演示中删除ORDER BY 子句,那么一切都会按预期工作。
【问题讨论】:
-
这似乎是一个错误。
-
@GordonLinoff 是的……这就是我的感觉。您能否确认我的查询应该产生预期的结果,忽略错误?我问是因为我不想在这里发布任何错误信息。
-
。 .即使没有测试查询,添加
order by也不应该更改返回的行的set。时期。order by应该只影响顺序,而不是行的内容。 -
@TimBiegeleisen ...您能否在实际的 DBMS 中确认这种行为,而不是这些在线演示工具?
-
这是一个 RexTester 错误,简单明了。
标签: sql left-join coalesce rextester