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