SQL-在数据库中查找缺少成绩的学生

SQL-在数据库中查找缺少成绩的学生,sql,sql-server,Sql,Sql Server,我的数据库中有三个表。第一个是以学生id为主键的学生。第二个是courses表,其中course_id作为主键,最后我有一个grades表,其中id_student和id_course作为外键,还有一个grade字段。我想了解学生的详细情况,他们在成绩表中缺少成绩。 我已经搜索了堆栈溢出,但找不到我正在寻找的确切答案。到目前为止,我尝试了以下查询: select st.student_id, st.lname, st.fname, cs.course_i

我的数据库中有三个表。第一个是以学生id为主键的学生。第二个是courses表,其中course_id作为主键,最后我有一个grades表,其中id_student和id_course作为外键,还有一个grade字段。我想了解学生的详细情况,他们在成绩表中缺少成绩。 我已经搜索了堆栈溢出,但找不到我正在寻找的确切答案。到目前为止,我尝试了以下查询:

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行,因为在我的数据库中,有一个学生在课程id 20中缺少分数。 **缺少的是学生id,其中课程id为20,并且没有相应的年级**


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

如果将连接更改为“左外连接”,则会看到没有分数的学生的空值

看 以及网上的许多其他链接

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子句应该只过滤这些行。

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

如果将连接更改为“左外连接”,则会看到没有分数的学生的空值

看 以及网上的许多其他链接

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子句应该只过滤这些内容。

成绩表的联接函数只查找与成绩表和学生表匹配的结果。在此处尝试完全外部联接以包括所有字段,而不管它们在两个表上是否匹配。见下面的代码:

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

成绩表的联接函数仅查找与成绩表和学生表匹配的结果。在此处尝试完全外部联接以包括所有字段,而不管它们在两个表上是否匹配。见下面的代码:

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

我认为
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;

交叉连接
生成学生和课程的所有组合。
左连接
/
在那里
过滤掉那些缺少分数的。

我认为
分数
上的
连接
需要两个键。如果我假设学生应该选修所有课程,那么这看起来像:

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;

交叉连接
生成学生和课程的所有组合。
LEFT JOIN
/
其中
过滤掉缺少分数的分数。

将您的JOIN更改为LEFT-OUTER JOIN我猜它的JOIN子句,您的第40个学生可能在其中一个表中缺少一条记录。如果未指定
连接
,则默认情况下为内部连接,请尝试使用
左连接
。然而,我们需要一些样本数据和样本输出来验证确切的原因。这是一次很好的尝试end@AntDC
选择st.student\u id、st.lname、st.fname、cs.course\u id、,g、 来自学生的成绩st LEFT OUTER join g上的成绩g.id\U student=st.student\U id LEFT OUTER join courses cs上的成绩C.course\U id=g.id\U course其中g.grade为空我已经尝试过,但仍然没有运气问题学生没有成绩行,因此where子句将他排除在外-已修改我的答案,以包括可能的错误解决方案。请提供样本数据以及所需结果。你如何知道哪些学生应该学习哪些课程?将你的连接更改为左外连接我猜它的连接子句,你的第40个学生可能在其中一个表中丢失了一条记录。如果未指定
连接
,则默认情况下为内部连接,请尝试使用
左连接
。然而,我们需要一些样本数据和样本输出来验证确切的原因。这是一次很好的尝试end@AntDC
选择st.student\u id、st.lname、st.fname、cs.course\u id、,g、 来自学生的成绩st LEFT OUTER join g上的成绩g.id\U student=st.student\U id LEFT OUTER join courses cs上的成绩C.course\U id=g.id\U course其中g.grade为空我已经尝试过,但仍然没有运气问题学生没有成绩行,因此where子句将他排除在外-已修改我的答案,以包括可能的错误解决方案。请提供样本数据以及所需结果。你怎么知道哪些学生应该学习哪些课程?我已经更新了我的问题,你可以检查是否有帮助。这个查询仍然不起作用。所以在年级中肯定没有学生Id=4和课程Id=20的行?还是有一行没有设置分数?我已经更新了我的问题,你可以检查是否有帮助。这个查询仍然不起作用。所以在年级中肯定没有学生Id=4和课程Id=20的行?还是有一行没有设置等级?