为什么两个查询的结果不同?

时间:2014-10-09 02:40:27

标签: sql

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行的结果是不正确的。第二个给出了正确的结果。那么第一个有什么问题?

6 个答案:

答案 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哪个可以是不独一无二

在第二个查询中,您直接查询该表中course_id等于unique ID的位置!

答案 4 :(得分:0)

谢谢你们。我认为我的问题是我没有意识到其他学生可以和ID为10204的学生一起学习相同的课程。这就是为什么虽然条件是只询问学生10204的课程,结果都是关于所采取的课程由10204和其他学生共同完成。

答案 5 :(得分:-1)

因为takes.ID!= course.ID。第一个在where子句中使用takes.ID,而第二个使用course.ID