select distinct ID, title, takes.course_id
from course join takes
on course.course_id = takes.course_id
where takes.course_id in
(select takes.course_id
from takes
where ID = '10204');
select ID, title, takes.course_id
from course join takes
on course.course_id = takes.course_id
where ID = '10204';
我想查询课程ID和ID为10204的学生所选课程的标题。第一个给出5000行的结果是不正确的。第二个给出了正确的结果。那么第一个有什么问题?
答案 0 :(得分:1)
第一个查询为您提供了碰巧参加10204课程的所有学生的数据。
答案 1 :(得分:1)
基本上,第一个查询可以被解读为"查找所有课程和接受它们的学生,对于任何也由学生10204"进行的课程。您可以将第一个查询视为3方式连接。子查询select takes.course_id from takes where ID = '10204'
的结果将是"第三个"表
答案 2 :(得分:1)
因为每个人似乎都在提供点点滴滴,其中一些是奇怪的愤怒... ...
第一个问题是"向我提供有关学生和课程的信息,这些课程也由学生10204和#34;
第二个问题是"向我提供有关学生和课程的信息10204"
你说你想获得学生10204所选课程的课程ID和标题,所以显然第二个查询是正确的。你不关心其他学过相同课程的学生。
或许,从透视角度来看,重写第一个和不正确的查询将有所帮助:
select distinct ID, title, takes.course_id
from course
join takes
on course.course_id = takes.course_id
join takes as takes2
on takes.course_id = takes2.course_id
WHERE
takes2.ID = '10204');
答案 3 :(得分:0)
那可能是因为在第一个查询中你正在查询course_id
表中的takes
等于该表中的特定course_id
(哪个可以是不独一无二strong>)
在第二个查询中,您直接查询该表中course_id
等于unique ID
的位置!
答案 4 :(得分:0)
谢谢你们。我认为我的问题是我没有意识到其他学生可以和ID为10204的学生一起学习相同的课程。这就是为什么虽然条件是只询问学生10204的课程,结果都是关于所采取的课程由10204和其他学生共同完成。
答案 5 :(得分:-1)
因为takes.ID!= course.ID。第一个在where子句中使用takes.ID,而第二个使用course.ID