2014-10-09 116 views
0
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行,这是不正确的。第二个给出了正确的结果。那么第一个有什么问题呢?为什么两个查询的结果不同?

回答

-1

因为takes.ID!= course.ID。第一次使用takes.ID在WHERE子句中,但您使用course.ID

+0

如果'ID'是一个不明确的列名,你会得到一个错误。 – Thilo 2014-10-09 03:02:07

+0

在第一个查询中(选择takes.course_id from where ID ='10204')这显然是where子句中的take.ID。 第二个查询(从课程连接中选择ID,标题,takes.course_id参加course.course_id = takes.course_id 其中ID ='10204';)在where子句中显然是course.ID。 你疯了吗? – jewelnguyen8 2014-10-09 03:12:00

0

那么这是可以在第一次查询是因为您quering其中takescourse_id等于在一个特定的course_id第二表(它可以不是唯一的

,并在第二个查询您所查询笔直其中course_id等于该表中的unique ID

1

第一个查询为您提供所有碰巧需要10204课程的学生的数据。

1

基本上,第一个查询可以被理解为“查找所有课程以及学生采取他们,任何课程也是由学生10204采取的”。您可以将第一个查询看作3路加入。子查询select takes.course_id from takes where ID = '10204'的结果将是“第三”表。

1

添加到桩上,因为每个人似乎都提供的点点滴滴,其中有一些是奇怪的愤怒......

第一个查询表示“给我的信息对学生和课程在课程也由学生10204" 采取

第二个查询说:‘给我对学生采取的学生和课程信息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'); 
0

感谢你们。我认为我的问题是我没有意识到其他学生可以与ID为10204的学生一起参加相同的课程。因此,虽然条件是仅询问学生10204的课程,但结果全部是关于所采取的课程由10204和其他学生共同完成。

相关问题