【问题标题】: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 个班级,我就没有机会找到缺失的科目。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案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'
    

    【讨论】:

    • 谢谢先生,下次创建表关系之前我会考虑更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多