形势概述
当前的问题是如何从两个表(表A (material)和表B (MaterialRevision) )中选择值。但是,表A的PK可能在表B中存在,也可能不存在。当表B不存在时,这个问题中描述的查询不会返回表A、的值,但是it应该返回。所以基本上这里发生了什么:
当A.id存在于B.id中时,查询只返回值,而实际上,我需要它从A返回值,而A.id在B.id中也不存在。
问题:
假设有两张桌子。表材料和表材料修订。注意,PK idMaterial是中的FK。
当前的“模拟”表

查询目标
记住,这两张表是对真实表格的简化。
对每个材料,打印材料变量和最后(最大) RevisionDate从MaterialRevision。如果没有RevisionDate,则打印“上一次修订日期”的空白("")。
什么是错误发生的
对每个材料,打印材料变量和最后(最大) RevisionDate从MaterialRevision。如果没有修改的材料,不要打印材料(跳过)。
电流码
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)用于达到本问题所述状态的引用和链接
PS我希望这个问题能被正确理解,因为我花了很多时间来构建它。我对堆叠溢出进行了大量的研究,在几次尝试失败之后,我别无选择,只能寻求帮助。
发布于 2018-10-30 16:21:41
您应该使用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子句中添加了它
发布于 2018-10-30 16:25:04
您应该使用左边的外部连接,而不是使用交叉积。
您的查询应该如下所示:
SELECT idMaterial, nextRevisionableDate, obsolete,
revisionDate AS lastRevisionDate
FROM Material
LEFT OUTER JOIN MaterialRevision AS mr On
Material.idMaterial = MaterialRevision.id
AND mr.revisionDate = (SELECT MAX(ch.revisionDate) from MaterialRevision ch
WHERE mr.idMaterial = ch.idMaterial)
WHERE obsolete = 0;这里,您可以找到一些关于联接类型的文档。
https://stackoverflow.com/questions/53068528
复制相似问题