0

私は評価結果のデータベースを持っており、生徒、学年、年、学期を識別するフィールドがあります。以下のクエリは、ある開始点と終了点で特定の科目の評価を受けている生徒を見つけます。

SELECT
  a1.PupilId
FROM assessment as a1
  JOIN assessment as a2
    USING (PupilId)
WHERE a1.GradeID in('1A','1B','1C')
    AND a2.GradeID in('5A','5B','5C')
    AND a1.NCYear = '1'
    AND a1.Term = '6'
    AND a2.NCYear = '2'
    AND a2.Term = '6'
    AND a1.Subject = '31'
    AND a2.Subject = '31'
    AND a1.Type = 'assessment'
    AND a2.Type = 'assessment'

これは問題なく動作しますが、ここで、開始学年 (つまり、NCYear='1' および Term='6') を持っているが、最終学年へのエントリを持っていない生徒を見つけたいと考えています。NOT EXISTS をいじってみましたが、うまくいきません。

明確にするために、評価表を次に示します。

id | Subject | PupilId | NCYear | Term | GradeID | Type
--------------------------------------------------------
1  | 31      | 1       | 1      | 6    | 1A      | assessment
2  | 31      | 1       | 2      | 6    | 5A      | assessment
3  | 31      | 2       | 1      | 6    | 1A      | assessment

上記の SQL クエリは PupilID 1 を返す必要があります。PupilID 2 を返すクエリが必要です。開始評価はありますが、終了評価はありません。

助言がありますか?

4

2 に答える 2

0

このクエリを if で試してください

SELECT
  a1.PupilId
FROM assessment as a1
  JOIN assessment as a2
    USING (PupilId)
WHERE a1.GradeID in('1A','1B','1C')
    AND a2.GradeID in('5A','5B','5C')
    AND a1.NCYear = '1'
    AND a1.Term = '6'
    AND a2.NCYear = '2'
    AND a2.Term = '6'
    AND a1.Subject = '31'
    AND a2.Subject = '31'
    AND a1.Type = 'assessment'
    AND a2.Type = 'assessment'
    AND IF(a1.NCYear = 1, IF(a1.Term = 6,a2.GradeID IS NULL,1),1)
于 2013-01-25T18:41:09.257 に答える
0

OUTER JOIN を使用する必要があります。

SELECT
  a1.PupilId
FROM assessment as a1
  OUTER JOIN assessment as a2
    ON a2.PupilId = a2.PupilId AND a2.NCYear = '2' AND a2.GradeID in('5A','5B','5C') AND a2.Term = '6' AND a2.Subject = '31' AND a2.Type = 'assessment'        
WHERE a1.GradeID in('1A','1B','1C')
    AND a1.NCYear = '1'
    AND a1.Term = '6'
    AND a1.Subject = '31'
    AND a1.Type = 'assessment'
    AND a2.PupilId IS NULL
于 2013-01-25T18:56:45.640 に答える