【问题标题】:SQL- Find the students who are missing their grades in databaseSQL-在数据库中查找丢失成绩的学生
【发布时间】:2020-02-27 22:06:24
【问题描述】:

我的数据库中有三个表。第一个是以 student_id 作为主键的学生。第二个是以 course_id 作为主键的课程表,最后我有一个以 id_student 和 id_course 作为外键的成绩表,以及一个成绩字段。我想获取成绩表中缺少成绩的学生的详细信息。 我搜索了堆栈溢出,但找不到我正在寻找的确切答案。到目前为止,我尝试过的是以下查询:

select st.student_id,
       st.lname,
       st.fname,
       cs.course_id,
       g.grade 
from students st 
join grades g 
   on g.id_student = st.student_id 
join courses cs 
   on cs.course_id = g.id_course 
where g.grade is null

如果我在没有 where 条件的情况下尝试相同的查询,我会得到 39 行,但我应该得到 40 行,因为在我的数据库中有一个学生在 course_id 20 中缺少成绩。 ** 缺少的是 student_id,其中 course_id 为 20,并且不存在成绩。**

【问题讨论】:

  • 将您的 JOINS 更改为 LEFT OUTER JOIN
  • 我猜它的连接子句,你的第 40 个学生可能在其中一个表中丢失了一条记录。如果你没有指定join'默认是一个内连接,尝试使用left join。但是,我们需要一些样本数据和样本输出来验证确切的原因。这是你的一次很好的尝试
  • @AntDC select st.student_id,st.lname,st.fname,cs.course_id,g.grade from students st LEFT OUTER join grades g on g.id_student = st.student_id LEFT OUTER join courses cs on cs.course_id = g.id_course where g.grade is null我已经尝试过了,但仍然没有运气
  • 有问题的学生没有成绩行,因此 WHERE 子句将他排除在外 - 已修改我的答案以包含可能的解决方案。
  • 请提供样本数据以及期望的结果。你怎么知道哪些学生应该选修哪些课程?

标签: sql sql-server


【解决方案1】:

grades 表的连接函数只查找与 Grades 表和 Students 表都匹配的结果。在此处尝试完全外连接以包含所有字段,无论它们是否在两个表上都匹配。见以下代码:

SELECT 
st.student_id, st.lname, st.fname, cs.course_id, g.grade

FROM students st

FULL OUTER JOIN grades g
ON g.id_student = st.student_id

FULL OUTER JOIN courses cs
ON cs.course_ID = g.id_course

WHERE g.grade IS NULL

【讨论】:

    【解决方案2】:

    我认为grades 上的join 需要两个 键。如果我假设学生应该学习所有课程,那么这看起来像:

    select st.student_id, st.lname, st.fname, cs.course_id,
           g.grade 
    from students st cross join
         courses c left join
         grades g 
         on g.id_student = st.student_id and
            g.id_course = c.course_id
    where g.grade is null;
    

    CROSS JOIN 生成学生和课程的所有组合。 LEFT JOIN/WHERE 过滤掉那些缺失的成绩。

    【讨论】:

      【解决方案3】:

      因为您使用 JOIN,所以您只能获取所有 3 个表中存在的行。

      如果您将 JOINS 更改为 LEFT OUTER JOIN,您将看到没有成绩的学生的 NULLS。

      https://www.w3schools.com/sql/sql_join.asp 以及网络上的许多其他链接

      SELECT * FROM
      (
      select st.student_id,st.lname,st.fname,cs.course_id,g.grade 
      from students st 
      LEFT OUTER join grades g on g.id_student = st.student_id 
      LEFT OUTER join courses cs on cs.course_id = g.id_course 
      )SUB_Q WHERE SUB_Q.grade IS NULL
      

      内部查询应该返回所有学生,没有成绩的学生应该有一个 null 的成绩。所以外部查询的 WHERE 子句应该过滤到那些。

      【讨论】:

      • 我已经更新了我的问题,您可以检查是否有任何帮助。此查询仍然无效。
      • 所以学生 ID = 4 和课程 ID = 20 的年级肯定没有行?还是有没有设置成绩的行?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多