首页 > 解决方案 > MYSQL - FK存在和不存在时的SubSelect

问题描述

情况概述

当前的问题是关于从两个表table A (material)table B (MaterialRevision)中选择值的问题。但是,表 A 的 PK 在表 B 中可能存在也可能不存在。当它不存在时,此问题中描述的查询不会返回表 A 的值,但它应该。所以基本上这就是发生的事情:

该查询仅在 B.id 中存在 A.id 时返回值,实际上,当 B.id 中不存在 A.id 时,我需要它从 A 返回值。

问题:

假设有两个表。表材料和表材料修订。请注意,PK idMaterialMaterialRevision中的 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从多个获取最后日期记录

MySQL - 如何根据另一个 SELECT 的值进行 SELECT

MySQL查询选择JOIN表中不存在id的地方

PS我希望这个问题得到正确理解,因为我花了很多时间来构建它。我在 stackoverflow 中进行了很多研究,经过几次失败的尝试后,我别无选择,只能寻求帮助。

标签: mysqlsqlsubquery

解决方案


你应该使用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子句中省略了它


推荐阅读