2016-12-29 4 views
0

私はある学期を含む学年のすべてのレッスンを受けようとしています。 The orange relations are the relevant relations私は同じオブジェクトを2回取得します

クエリ:

オレンジ色の関係は、関連する関係している

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+"%' 

クエリは、私はこのクエリから2回同じレッスンを取得し、働き、まだ。

+1

迅速かつ不満足な方法は、SELECTリストの先頭にDISTINCTを追加することです。 – Randy

答えて

1

あなたは、少なくとも2つの理由から、重複を取得することができます:

  • 同じレッスン
  • 異なる学生が同じ先生グレード
に従うことができ、特定の学生に続いて別の教師の等級に発生する可能性があります

次の(テストされていない)入れ子になったSQLはこれを解決できます。私は結合条件を置くよりも優れたプラクティスであると考えられJOIN構文を使用

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+"%' 
      ) 

注:これは、少なくとも一つの生の学生がそれにリンクされているこれらの各レッスンやチェックの教師グレードのIDを取得しますWHERE節。 MS Accessは、JOIN句で括弧を使用することについて非常に厄介なので、動作させるにはこれらのビットを使用する必要があります。

+0

ありがとうございます。私は壁に頭をぶつけようとしていた。ありがとうございました! –

関連する問題