5

3つのテーブルを結合する必要があるSQLステートメントを作成しようとしています

EnrollStudents

EnrollID     UserID     SubjID
1            1          1
2            1          2
3            1          3
4            3          1
5            7          2

学生

StudentID     UserID     YearID
1             1          1
2             3          1
3             7          1

科目

SubjID     SubjCode     YearID
1          English      1
2          Math         1
3          Science      1

出力は次のようになります...

UserID
2
3

User 1すでにすべての科目を登録しているので、一部の科目はまだ登録されていないため、User 3とはまだ表示されています。User 7

私は運がない次のSQLステートメントを持っています:

SELECT Students.UserID 
FROM Students 
WHERE Students.YearID = 1 
    AND Students.UserID NOT IN (SELECT EnrollStudents.UserID 
                                FROM EnrollStudents)

何か案は?

4

3 に答える 3

6
SELECT s.UserID
FROM Students AS s
LEFT OUTER JOIN EnrollStudents AS es ON s.UserID = es.UserID
GROUP BY s.UserID
HAVING COUNT(DISTINCT(es.SubjID)) < (SELECT COUNT(*) FROM Subjects)

...ちょっと待って。EnrollStudentsサンプル出力とテーブルで「StudentID」と「UserID」を混同していると思います。

http://sqlfiddle.com/#!3/61618/1

于 2012-07-12T15:34:29.570 に答える
1
select s.UserID
from Students s
left outer join (
    select UserID
    from EnrollStudents
    group by UserID
    having count(distinct SubjID) = 3
) a on s.UserID = a.UserID
where a.UserID is null 
    and s.YearID = 1

SQLフィドルの例

于 2012-07-12T15:30:08.263 に答える
1

初年度の必須クラスすべてに登録していない初年度のすべての学生を認定しようとしているようです。したがって、学生2と3のみを取得しようとしています。データには1年IDのグループの全員が含まれていますが、私は実際に複数年にわたるデータがあり、1年目の学生と、1年目の要件にも関連付けられている科目だけに明確に関心があると思われます。

最初のクエリ(YrSubjects)の結果は、問題の1年間のクラス数を事前に集計するため、すべての学生に対してこれを繰り返し行う必要はありません。一度だけ...クエリの残りの部分への割り当てられていないJOINはデカルト座標になりますが、1人あたり1つのレコードであり、重複はありません。

次は残りのテーブル/結合です。1年目のみに関連付けられている科目に登録されている学生を取得します。where句は、「1年目」の学生のみに明示的に制限します。

最後のHAVING条項は、初年度の要件の合計科目よりも少ない登録数を適用します。このクエリでは、期待している特定のハードコードされた数のサブジェクトに「固定」されていません...

SELECT 
      S.StudentID 
   FROM 
      ( select count(*) as YrClasses 
           from 
              Subjects 
           where YearID = 1 ) YrSubjects,
      Students S
         JOIN EnrollStudents ES
            on S.UserID = ES.UserID
            JOIN Subjects S
               ON ES.SubjID = S.SubjID
              AND S.YearID = 1
   WHERE 
      S.YearID = 1 
   HAVING
      count(*) < YrSubjects.YrClasses
于 2012-07-12T15:46:44.887 に答える