在一对多关系查询中查找缺失的记录

Posted

技术标签:

【中文标题】在一对多关系查询中查找缺失的记录【英文标题】:Find missing records in ONE-TO-MANY relationship query 【发布时间】:2021-05-24 04:31:47 【问题描述】:

我有 3 张桌子:

Id ClassName
guid 1A
guid 2A

主题

Id SubjectName
guid Math
guid Biography

SubjectOfEachClass

Id ClassId SubjectId TeacherName
guid guid guid James Bond

我希望这些表的工作方式是:

表 Class 中将有 10 个类。 主题表中将有 10 个主题。 每个班级将有 10 个科目,对于 10 个班级,将有 100 条记录。

我遇到了一些问题,我查询了 SubjectOfEachClass 表,只有 95 条记录。 我用来查找缺失主题的查询命令是:

SELECT *
FROM Subject s
JOIN (
    SELECT *
    FROM SubjectOfEachClass
    WHERE ClassId = 'guid'
) AS sc ON s.Id = sc.SubjectId

我多次替换了ClassId,直到我发现错过了一些科目的班级。

我认为这种查询方式根本没有效率。如果我有 100 个科目和 100 个班级,我就没有机会找到缺失的科目。

【问题讨论】:

【参考方案1】:

查找所有课程中所有缺失的科目:

select c.id, c.classname , s.id , s.SubjectName
from class c
cross apply Subject s
where not exists (
   select 1 from SubjectOfEachClass sc 
   where sc.classid = c.id and sc.subjectid = s.id
)

【讨论】:

非常感谢先生,它工作得很好,我似乎还有很多关于 SQL 的知识【参考方案2】:

试试这个:

SELECT c.id AS classId,
       count(sc.id) AS countOfSubjects
FROM SubjectOfEachClass AS sc
INNER JOIN Classes AS c ON c.id = sc.classId
GROUP BY c.id
ORDER BY countOfSubjects

异常值会浮动。

【讨论】:

不是我想要的解决方案,而是查看所有记录的好方法。谢谢先生。【参考方案3】:

您的主表应该是SubjectOfEachClass,然后那些外部表SubjectClassjoin 您的主表。

select *
from SubjectOfEachClass sc
inner join Subject s on s.guid=sc.guid
inner join Class c on c.guid=sc.guid
where sc.ClassId = 'guid'

【讨论】:

谢谢先生,下次创建表关系之前我会考虑更多。

以上是关于在一对多关系查询中查找缺失的记录的主要内容,如果未能解决你的问题,请参考以下文章

多表查询

ACCESS级联删除一对多关系的记录

第九节:mybatis关联查询之一对多查询

在 SQL 连接语句中选择一对多关系中最匹配的记录

sql 一对多的查询

从 2 个表中获取记录数 - 一对多关系