mysql - MYSQL - FK存在和不存在时的SubSelect
问题描述
情况概述
当前的问题是关于从两个表table A (material)和table B (MaterialRevision)中选择值的问题。但是,表 A 的 PK 在表 B 中可能存在也可能不存在。当它不存在时,此问题中描述的查询不会返回表 A 的值,但它应该。所以基本上这就是发生的事情:
该查询仅在 B.id 中存在 A.id 时返回值,实际上,当 B.id 中不存在 A.id 时,我需要它从 A 返回值。
问题:
假设有两个表。表材料和表材料修订。请注意,PK idMaterial是MaterialRevision中的 FK 。
查询目标
Obs:记住这两个表是真实表的简化。
对于每个材料,打印材料变量和来自 MaterialRevision 的最后(最大)RevisionDate。如果没有 RevisionDate,则打印 BLANK ("") 作为“最后修订日期”。
发生了什么错误
对于每个材料,打印材料变量和来自 MaterialRevision 的最后(最大)RevisionDate。如果材料没有修订,则不打印材料(跳过)。
当前代码
SELECT
Material.idMaterial,
Material.nextRevisionDate,
Material.obsolete,
lastRevisionDate
FROM Material,
(SELECT MaterialRevision.idMaterial, max(MaterialRevision.revisionDate) as "revisionDate" from MaterialRevision
GROUP BY MaterialRevision.idMaterial
) AS Revision
WHERE (Material.idMaterial = Revision.idMaterial AND Material.obsolete = 0)
用于达到此问题中描述的状态的参考和链接
为什么 MAX() 比 ORDER BY ... LIMIT 1 慢 100 倍?
MySQL - 如何根据另一个 SELECT 的值进行 SELECT
PS我希望这个问题得到正确理解,因为我花了很多时间来构建它。我在 stackoverflow 中进行了很多研究,经过几次失败的尝试后,我别无选择,只能寻求帮助。
解决方案
你应该使用JOIN
:
SELECT m.idMaterial, m.nextRevisionDate, mr.revisionDate AS "lastRevisionDate"
FROM Material m
LEFT JOIN MaterialRevision AS mr ON mr.idMaterial = m.idMaterial AND mr.revisionDate = (
SELECT MAX(ch.revisionDate) from MaterialRevision ch
WHERE mr.idMaterial = ch.idMaterial)
WHERE m.obsolete = 0
这是对什么INNER JOIN
和是LEFT JOIN
的解释RIGHT JOIN
。(如果您经常在查询中交叉表,您会喜欢它们)
一如既往m.obsolete
,我在SELECT
子句中省略了它
推荐阅读
- docker - 在 docker 容器中安装一个 wheel 包
- sql-server - 连接到 SQL 数据库时出现 pyodbc 错误“无法打开登录请求的数据库“database3”。”
- html - 如何在 HTML 中编写输入电话号码的模式属性?
- python - 无法在使用烧瓶网络服务制作的网站中提交图像文件
- java - 使用 mongorepository 更新特定字段
- django - Django 选择未显示
- javascript - 为什么我的函数不是测试环境中的函数
- flutter - 自定义颤振图表中的轴并删除破折号
- firebase - 使用 Firestore 进行分页
- windows - 如何在windows后台运行tomcat?