【问题标题】:NULL Values missing of joined table连接表中缺少 NULL 值
【发布时间】:2020-10-14 11:22:08
【问题描述】:

这是一个简单的例子:sqlfiddle.com/#!9/8087c5/1

我有以下查询:

select
    contracts.ID as contractID,
    departments.ID as departmentID,
    max(invoices.timestamp) as timestamp
from contracts
    left join departments on departments.ID = contracts.departmentID and departments.accountingType > 0
    left join invoices on contracts.ID = invoices.contractID
group by contractID
having departmentID is not null;

我希望得到如下结果:

+------------+--------------+---------------------+
| contractID | departmentID | timestamp           |
+------------+--------------+---------------------+
| 101        | 301          | NULL                |
+------------+--------------+---------------------+
| 102        | 302          | NULL                |
+------------+--------------+---------------------+
| 103        | 303          | 2020-05-01 11:11:00 |
+------------+--------------+---------------------+

相反,我得到:

+------------+--------------+---------------------+
| contractID | departmentID | timestamp           |
+------------+--------------+---------------------+
| 103        | 303          | 2020-05-01 11:11:00 |
+------------+--------------+---------------------+

我不明白为什么查询会削减最后一个左连接表的 NULL 值。我错过了一些非常简单的东西吗?

【问题讨论】:

  • 不同的查询产生不同的结果。解释原因似乎几乎超出了 SO 的范围。请注意,GROUP BY 子句应始终包含 SELECT 中包含的所有非聚合列。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停整体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
  • 你改进了很多,虽然我们仍然不能剪切&粘贴&运行而且这不是最小的&你没有识别&砍到第一个坏的表达等等。但是你能来描述你的错误——一个常见问题。请在考虑发布之前阅读您的教科书和/或手册和谷歌任何错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有和没有您的特定字符串/名称和站点:stackoverflow.com 和标签;阅读许多答案。如果您发布问题,请使用一个短语作为标题。反映你的研究。请参阅How to Ask 和投票箭头鼠标悬停文本。
  • 我希望它存在,因为我确实希望列部门ID 在列时间戳中具有 NULL 值的结果。据我了解,我不排除列时间戳的任何 NULL 值。如果我要删除我的陈述,我仍然没有得到 NULL 值。请让我在 sql-fiddle 上构建一个示例。这可能需要我几分钟。

标签: mysql join temp-tables


【解决方案1】:

好的 - 问题是 group by contractID 正确的是 group by contracts.IDgroup by contractID 按连接的发票表格列 contractID 分组,这就是缺少列的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多