在一对多关系查询中查找缺失的记录
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
,然后那些外部表Subject
和Class
将join
您的主表。
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'
【讨论】:
谢谢先生,下次创建表关系之前我会考虑更多。以上是关于在一对多关系查询中查找缺失的记录的主要内容,如果未能解决你的问题,请参考以下文章