2012-06-05 2 views
0

나는 지식을 새로이 들라는 짧은 퀴즈를 제공하는 훈련 관리 웹 기반 시스템을 개발 중이다. 각 부서에서 마지막으로 보내는 퀴즈에 참가자가 아닌 사람의 이름을 표시하는 방법은 무엇입니까?

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 

답변

3

그런 다음 완료 된 모든 조합을 제거하기 위해 NOT EXISTS를 사용, 직원 및 퀴즈의 모든 조합을 얻을 CROSS JOIN을 사용할 수 있습니다 : 당신의 도움에 대한

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 
     ) 
+0

감사합니다 . 정말 감사. – user1395782

관련 문제