首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL -当FK确实存在或不存在时,SubSelect

MYSQL -当FK确实存在或不存在时,SubSelect
EN

Stack Overflow用户
提问于 2018-10-30 16:10:29
回答 2查看 79关注 0票数 0

形势概述

当前的问题是如何从两个表(表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。如果没有修改的材料,不要打印材料(跳过)。

电流码

代码语言:javascript
复制
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()比订单慢100倍。限制1?

MySQL从多个获取最后约会记录

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

MySQL查询选择连接表中不存在id的位置

PS我希望这个问题能被正确理解,因为我花了很多时间来构建它。我对堆叠溢出进行了大量的研究,在几次尝试失败之后,我别无选择,只能寻求帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-30 16:21:41

您应该使用JOIN

代码语言:javascript
复制
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 JOINLEFT JOINRIGHT JOIN的解释。(如果你经常在查询中跨表,你会喜欢它们的)

由于m.obsolete将始终为真,所以我在SELECT子句中添加了它

票数 1
EN

Stack Overflow用户

发布于 2018-10-30 16:25:04

您应该使用左边的外部连接,而不是使用交叉积。

您的查询应该如下所示:

代码语言:javascript
复制
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;

这里,您可以找到一些关于联接类型的文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53068528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档