2010-07-26 116 views
1

我正在使用SQL首次加入相对于很多的表,我有错误与此:加入多个表的查询涉及

我有三个表,

学期表

StudentID Department Semester 
1   1   1 

课程表

CourseID CourseName Semester 
1   S.E   1 
2   D.B   1 

ExamAttend表(外键StudentID和CourseID )

StudentID CourseID Marks 
1   1  88 
1   2  90 

我试图通过

Select CourseName,Marks 
from CourseID 
Inner Join ExamAttend on (
    Select CourseID from Course as c, Semester as s where s.Semester = c.Semester 
) = ExamAttend.CourseID; 

得到reslut此查询显示我的错误子查询不能返回多个查询与“=”使用

任何人都可以建议我当方法来完成查询?我是否缺少内连接的任何语法?

+1

你没有学生表。它在哪里? – hgulyan 2010-07-26 09:09:38

+0

@hgulyan我有学生表... 学期表为我存储现在的sem .. – 2010-07-26 09:36:20

回答

2
SELECT CourseName,Marks 
FROM Course C INNER JOIN ExamAttend E 
ON C.CourseID = E.CourseID 
INNER JOIN Semester S 
ON S.StudentID = E.StudentID 
3

尝试用单独的每个表加盟:

SELECT 
    CourseName, 
    Marks 
FROM Course 
INNER JOIN Semester 
ON Semester.StudentID = ExamAttend.StudentID 
INNER JOIN ExamAttend 
ON CourseID.CourseID = ExamAttend.CourseID 
AND ExamAttend.SemesterId = Semester.SemesterId 
+0

学生表也在那里.. 但我在学期表中包含了一个当前的学生学期纪录.. 我想要“学期表和课程表和ExamAttend表“加入.. :( – 2010-07-26 09:29:02

+0

@Nagaraj:对不起,我认为这是一个错误之前的问题。 – 2010-07-26 09:32:57

+0

我已经写了学期..有人编辑它错了我又做了更改..谢谢反正:) – 2010-07-26 09:35:33

2

试试这个

SELECT  Semester.StudentID, Course.CourseID.CourseName, ExamAttend.Marks 
FROM   ExamAttend INNER JOIN 
         Semester ON ExamAttend.StudentID = Semester.StudentID INNER JOIN 
         Course ON ExamAttend.CourseID = Course.CourseID 
1

当联接表你能做的最好的事情是:首先,它写在纸上,并用数学集合代数。如果你有三个表:学生,课程,考试成绩,你可以这样写:(学生和(课程和考试成绩))使用这个AND可以被INNER JOIN替换,写作:(学生内部加入(课程内部加入考试) ))。

因为你要设置distincted列,这样就解决到:学生内部连接(课程内加入ExamAttend在Course.CourseID = ExamAttend.CourseID)在Student.StudentID = ExamAttend.StudentID

SQL分析器首先会建立一个Course和ExamAttend的投影,第二个投影与Student。

如果你想对所有的学生进行投影,即使学生没有一门课程的成绩或任何其他的,你可以写在你的收藏代数: 学生OR(课程和ExamAttend),其中OR可以是左外部连接。

请注意,您选择了正确的表格,您可以在其中按照您想要加入的表格的路径。有几种解决方案,选择错误的解决方案会导致查询缓慢。

希望它有帮助。