【发布时间】: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