0

私は、知識をリフレッシュするための短いクイズをユーザーに提供するトレーニング管理 Web ベースのシステムを開発しています。とにかく、次のデータベース設計があります。

Employee Table: Username, Name, DivisionCode
Divisions Table: SapCode, DivisionShortcut
Quiz Table: QuizID, Title, IsSent
Question Table: QuestionID, Question, QuizID...
UserQuiz Table: UserQuizID, QuizID, Username, Score.

ちょうど最後のクイズで、すべての部門のすべての非参加者の名前を表示するクエリを思いつくことができました。私が今欲しいのは、参加するためにユーザーに送信されたすべてのクイズで非参加者の名前を表示することです。結果は、クイズのタイトルと DivisionShortcut でグループ化して一覧表示する必要があります。では、どうやってそれを行うのですか?

私のクエリ:

SELECT d.DivisionShortcut, e.Name 
FROM employee e
 join Divisions d on (e.DivisionCode = d.SapCode)
 left join (select A.QuizID, a.Username 
            from UserQuiz a join 
                 (select max(QuizID) QuizID from dbo.Quiz where IsSent=1) b
                       on a.QuizId = b.QuizID ) c
                                 on e.Username = c.Username
                                 WHERE c.QuizID is null
                                 Order By d.DivisionShortcut
4

1 に答える 1

3

を使用CROSS JOINして、employee と Quiz のすべての組み合わせを取得しNOT EXISTSてから、完了したすべての組み合わせを削除するために使用できます。

SELECT  *
FROM    Employee e
        INNER JOIN Divisions d
            ON e.DivisionCode = d.SapCode
        CROSS JOIN Quiz
WHERE   Quiz.IsSent = 1 
AND     NOT EXISTS
        (   SELECT  1
            FROM    UserQuiz uq
            WHERE   uq.QuizID = Quiz.QuizID
            AND     uq.UserName = e.UserName
        )
于 2012-06-05T12:53:26.957 に答える