SQL联接查询3个表不起作用

时间:2017-04-29 15:23:18

标签: sql sql-server join

我是SQL的新手,需要一些帮助。 我的数据库中有以下3个表格表。

STUDENT Table whose tuple has the following format:
{StuID, LastName, FirstName, MiddleName, EmailID}

COURSES Table whose tuple has the following format:
{CourseID, CourseName, CreditHours, CourseDescription}

TAKEN_COURSES Table whose tuple has the following format:
{ID, StuID, CourseID, Semester, Year}.

现在我想以下列格式显示学生所有课程:

LastName FirstName MiddleName Course1   Course2
May         Alice    Mary      Math     Science
Wood        Bob      Adams     Physics  History

事先知道每个学生只能参加2门课程。如果学生只参加1门课程,则其他参赛作品可以为空白。

我加入了3个表:

Select Student Student.LName, Student.FName, Student.MiddleName, Courses.CourseName from Student INNER JOIN (Courses INNERJOIN TakenCourses ON Courses.CourseID=TakenCourses.CourseID) ON Student.StuID = TakenCourses.CourseID

这给了我以下内容:

LastName FirstName MiddleName CourseName
May         Alice    Mary      Math     
May         Alice    Mary      Science
Wood        Bob      Adams     Physics  
Wood        Bob      Adams     History

但我不希望如此。我希望所有课程在一个元组中一个接一个地出现,我真的很难实现这一目标。关于需要做什么的任何建议?

1 个答案:

答案 0 :(得分:2)

您可以使用聚合执行所需操作,特别是因为有两个值。您的查询大部分都在那里:

Select s.LName, s.FName, s.MiddleName, 
       min(c.CourseName) as course1,
       (case when min(c.CourseName) <> max(c.CourseName) then max(c.CourseName)
        end) as course2
from Student s join
     TakenCourses tc
     on s.StuID = tc.CourseID
     Courses c 
     on c.CourseID = tc.CourseID
group by s.LName, s.FName, s.MiddleName;

为什么聚合有用?好吧,你每个学生有多行,你只想要一行。在这种情况下,group by通常是正确的方法。

还要注意使用表别名,这样可以简化写入和读取查询。此外,最好在from子句中避免括号,如果没有必要的话。