2016-12-29 55 views
0

我想要獲得包含特定術語的年級的所有學生的課程。我得到兩次相同的對象

橙色的關係是相關關係: The orange relations are the relevant relations

查詢:

SELECT 
tg.nhsColor AS cellColor, 
tg.nhsTgradeName AS LessonName, 
lsons.nhsLessonID AS LessonID, 
lsons.nhsTgradeID AS TgradeID, 
lsons.nhsDay AS nhsDay, 
lsons.nhsHour AS nhsHour, 
tg.nhsTeacherID AS TeacherID 
FROM 
nhsTeacherGrades AS tg, 
nhsLessons AS lsons, 
nhsLearnGroups, 
nhsMembers AS mem, 
nhsGrades AS grd 
WHERE 
tg.nhsTgradeID = lsons.nhsTgradeID 
AND nhsLearnGroups.nhsTgradeID = tg.nhsTgradeID 
AND mem.nhsUserID = nhsLearnGroups.nhsStudentID 
AND mem.nhsGradeID = grd.nhsGradeID 
AND grd.nhsGradeName LIKE '%"+gradePart+"%' 

的查詢工作,但是,我從這個查詢得到同樣的教訓兩次。

+1

一種快速且令人不滿意的方式是將DISTINCT添加到SELECT列表的開頭。 – Randy

回答

1

你可以重複至少有兩個方面的原因:

  • 同樣的教訓可以在不同的老師打分,然後在一定的學生髮生
  • 不同的學生可以按照同樣的老師級

以下(未經測試)嵌套SQL可以解決此問題。它得到每節課,並檢查其中的這些都至少一個可行的學生鏈接到它的老師級ID:

SELECT  tg.nhsColor AS cellColor, 
      tg.nhsTgradeName AS LessonName, 
      lsons.nhsLessonID AS LessonID, 
      lsons.nhsTgradeID AS TgradeID, 
      lsons.nhsDay AS nhsDay, 
      lsons.nhsHour AS nhsHour, 
      tg.nhsTeacherID AS TeacherID 
FROM  nhsLessons AS lsons 
INNER JOIN nhsTeacherGrades AS tg 
     ON tg.nhsTgradeID = lsons.nhsTgradeID 
WHERE  tg.nhsTgradeID IN (
       SELECT  grp.nhsTgradeID 
       FROM  (nhsLearnGroups grp 
       INNER JOIN nhsMembers AS mem 
         ON mem.nhsUserID = grp.nhsStudentID) 
       INNER JOIN nhsGrades AS grd 
         ON mem.nhsGradeID = grd.nhsGradeID 
       WHERE  grd.nhsGradeName LIKE '%"+gradePart+"%' 
      ) 

請注意,我用的是JOIN語法,這被認爲是更好的做法不是將加盟條件WHERE條款。 MS Access在JOIN子句中使用括號非常討厭,所以您可能需要使用這些來使其工作。

+0

謝謝先生。我正要將我的頭撞在牆上。謝謝! –

相關問題