代码之家  ›  专栏  ›  技术社区  ›  Nagaraj Tantri

涉及多个表的联接查询

sql
  •  1
  • Nagaraj Tantri  · 技术社区  · 14 年前

    对于许多表,我第一次使用SQL中的join,但出现了以下错误:

    我有三张桌子,

    学期表

    StudentID Department Semester
    1          1           1
    

    课程表

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

    exmattend表(外键如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;
    

    此查询显示错误,子查询在与“=”一起使用时无法返回多个查询

    有人能建议我一种完成查询的方法吗?我是否缺少任何带有内部联接的语法?

    4 回复  |  直到 7 年前
        1
  •  2
  •   hgulyan    14 年前
    SELECT CourseName,Marks 
    FROM Course C INNER JOIN ExamAttend E
    ON C.CourseID = E.CourseID 
    INNER JOIN Semester S
    ON S.StudentID = E.StudentID 
    
        2
  •  3
  •   Mark Byers    14 年前

    试着分别与每张桌子连接:

    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
    
        3
  •  2
  •   Khaled    14 年前

    试试这个

    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
    
        4
  •  1
  •   DannyS    14 年前

    当连接表格时,你能做的最好的事情是:先把它写在纸上,然后使用数学集合代数。就像如果你有三个表:student,course,examatend,你可以这样写:(student and(course and examatend)),使用这个可以替换为inner join,writing:(student inner join(course inner join examatend))。

    因为您必须设置不同的列,所以这将解析为:student.studentid=exmattend.studentid上的student inner join exmattend on course.courseid=exmattend.courseid

    SQL解析器将首先构建一个投影,当然是exmattend,然后是student的投影。

    如果你想与所有学生一起进行投影,即使学生没有课程或其他课程的分数,你也可以在你的集合代数中写作: 学生或(课程和考试),其中或可以留在外部连接。

    请注意,您选择了正确的表,在该表中您可以沿着一条路径找到要加入的表。有几种解决方案,选择错误的解决方案会导致查询速度变慢。

    希望它有帮助。