【问题标题】:Strange behavior in a SQL left joinSQL 左连接中的奇怪行为
【发布时间】: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;

正如您在下面的演示中看到的那样,CD ID 都将 None 作为报告的新字段。我本来希望 D 单独拥有 None,而 C 应该报告为 NULL

有人能解释一下吗?更奇怪的是,如果我在上面的查询/演示中删除ORDER BY 子句,那么一切都会按预期工作。

Demo

【问题讨论】:

  • 这似乎是一个错误。
  • @GordonLinoff 是的……这就是我的感觉。您能否确认我的查询应该产生预期的结果,忽略错误?我问是因为我不想在这里发布任何错误信息。
  • 。 .即使没有测试查询,添加order by 也不应该更改返回的行的set。时期。 order by 应该只影响顺序,而不是行的内容。
  • @TimBiegeleisen ...您能否在实际的 DBMS 中确认这种行为,而不是这些在线演示工具?
  • 这是一个 RexTester 错误,简单明了。

标签: sql left-join coalesce rextester


【解决方案1】:

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

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;

因为 SQL Fiddle 给出了我们预期的确切结果。

Rex Tester 做了一些奇怪的事情。

【讨论】:

  • 嗨 Dinesh,这不会 produce the desired output 因为您的查询无法区分这两种类型的缺失值。无论如何,我的问题主要是关于尝试让原始查询工作,而不是使用解决方法。
  • 在您的问题中,Id D 的字段为空 ' ',但您将值插入为 NULL,我不明白问题所在。
  • 抱歉,在Base 表中D 有一个NULL 字段值,而不是空字符串。我知道您现在的查询来自哪里。
  • @TimBiegeleisen,相同的查询在sqlfiddle.com/#!9/df77a1/3 中给出了预期结果,在rextester.com/TYZVH46974 中给出了奇怪的结果。
猜你喜欢
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多