代码之家  ›  专栏  ›  技术社区  ›  Zaryab Waseem

带有联接的SQL查询将为所有其他行重复最上面一行的数据

  •  0
  • Zaryab Waseem  · 技术社区  · 6 年前

    下面的SQL查询检索并重复所有其他行的最上面一行的数据。

    SELECT 
        Student.StuRollNo, Student.StuName, Student.StuFName, 
        (SELECT TOP 1 M.SubjectObtMarks 
         FROM Marking M 
         WHERE M.SubjectID = 'SubUrdu' 
           AND M.ExamID = 1) AS Urdu,
        (SELECT TOP 1 M.SubjectObtMarks 
         FROM Marking M 
         WHERE M.SubjectID = 'SubEng' 
           AND M.ExamID = 1) AS Eng,
        (SELECT TOP 1 M.SubjectObtMarks 
         FROM Marking M 
         WHERE M.SubjectID = 'SubPhy' 
           AND M.ExamID = 1) AS Phy,
        (SELECT TOP 1 M.SubjectObtMarks 
         FROM Marking M 
         WHERE M.SubjectID = 'SubChem' 
           AND M.ExamID = 1) AS Chem,
        (SELECT TOP 1 M.SubjectObtMarks 
         FROM Marking M 
         WHERE M.SubjectID = 'SubBio' 
           AND M.ExamID = 1) AS Bio,
        (SELECT TOP 1 M.SubjectObtMarks 
         FROM Marking M 
         WHERE M.SubjectID = 'SubIsl' 
           AND M.ExamID = 1) AS Isl,
        (SELECT TOP 1 SUM(Marking.SubjectObtMarks) 
         FROM Marking 
         WHERE ExamID = 1) AS ObtMarks
    FROM 
        Exam, Student 
    INNER JOIN 
        PrimaryData ON Student.StuRollNo = PrimaryData.StuID 
    INNER JOIN 
        Section ON Section.SectionID = PrimaryData.SectionID 
    WHERE 
        Section.SectionName = 'M1' 
        AND Exam.ExamID = 1;
    

    以下是它检索到的内容:

    Problem Pic

    数据库关系图:

    DB Diagram

    请帮我解决这个问题。谢谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   NDUF    6 年前

    这是因为你不限制分数属于哪一个学生。 所以您的查询基本上总是获取第一个标记,而不是检查这个标记属于谁。

    SELECT 
    Student.StuRollNo, Student.StuName, Student.StuFName, 
    (SELECT TOP 1 M.SubjectObtMarks 
     FROM Marking M 
     WHERE M.SubjectID = 'SubUrdu' 
       AND M.ExamID = 1
       AND M.StuID = S.StuID) AS Urdu
    FROM 
        Exam, Student S
    INNER JOIN 
        PrimaryData ON Student.StuRollNo = PrimaryData.StuID 
    INNER JOIN 
        Section ON Section.SectionID = PrimaryData.SectionID