2013-10-10 4 views
2

세 개의 테이블이 있는데 필자는 질문에 불필요한 정보를 제거하여 맨손으로 보이지 않는 이유입니다.한 행의 일대 다 관계에있는 모든 레코드 얻기

세션

SessionId (int) PK 

답변

AnswerId (int) PK 
AnswerDetail (varchar) 
QuestionNumber (int) 
IsCorrect (bit, null) 

SessionAnswers

SessionAnswerId (int) PK 
QuestionNumber (int) 
SessionId (int) FK 
AnswerId (int) FK 

가 상상 10 개의 질문으로 각각 Session에 대한 행을 갖고 싶습니다. 그리고 각각의 질문과 대답은 모두 같은 행에 있습니다. 나는. Session 각각에 대해 각 질문 번호와 해당 세션의 대답이 나와야합니다.

불행히도 SQL을 몇 년 동안 직접 작성하지 않았으므로 약간의 어려움을 겪고 있습니다. 지금까지이 데이터를 보여주기 위해 관리했지만 세션에서 제공하는 모든 대답에 대해 새로운 행을 제공합니다.

SELECT dbo.Sessions.SessionId, dbo.Answers.IsCorrect, dbo.Answers.QuestionNumber 
FROM dbo.Answers INNER JOIN 
     dbo.SessionAnswers ON dbo.Answers.AnswerId = dbo.SessionAnswers.Answer_AnswerId INNER JOIN 
     dbo.Sessions ON dbo.SessionAnswers.Session_SessionId = dbo.Sessions.SessionId 

내 목표를 달성하기 위해 무엇을 고려해야합니까?

하지만 제가보고 싶은 것은 : enter image description here : 내가 현재 무엇을보고이 여기

SessionAnswer을 반복하는 방법을 잘 모르겠어요

SessionId | Date | QuestionNumber1 | IsCorrect | QuestionNumber2 | IsCorrect 
------------------------------------------------------------------------------ 
    1  | Date | AnswerDetail1 | IsCorrect1 | AnswerDetail2 | IsCorrect2 

즉, 내 그림의 행 1-12는 모두 같은 행에 있어야합니다.

+0

는 소리. 세션에 대한 하나의 행, 피봇 테이블과 같은 해당 세션 내의 각 질문 및 답변에 대한 하나의 열. 이것은 SQL-Server에서 달성하기가 매우 어려우며 동적 인 SQL이 꽤 필요할 것입니다. – JDB

+0

@ Cybȫʁgϟ37 아니요, 열 수는 고정되어 있습니다. – ediblecode

+1

귀하의 질문에 따라하기가 매우 어렵습니다. 질문 ** X ** 및 대답 ** X **는 무엇을 나타 냅니까? – JDB

답변

1

아 ... 이제 알았습니다. 용의자처럼 조인을 수행해야하지만 조인에 질문 번호를 포함시켜야합니다. 그런 다음 각 질문에 대해 한 번씩 조인을 10 번 반복해야합니다. 동일한 별명을 사용하는 것이 필수적입니다. 왜냐하면 동일한 두 테이블에 10 번 참여하기 때문입니다. 각 조인을 구별 할 수 있어야합니다.

SELECT  S.SessionId 
     , A1.AnswerDetail AS AnswerDetail1 
     , A1.IsCorrect AS IsCorrect1 
     , A2.AnswerDetail AS AnswerDetail2 
     , A2.IsCorrect AS IsCorrect2 
     , A3.AnswerDetail AS AnswerDetail2 
     , A3.IsCorrect AS IsCorrect2 
     -- ... 
FROM  Sessions AS S 
-- Question 1 
INNER JOIN SessionAnswers AS SA1 
     ON SA1.SessionId = S.SessionId 
     AND SA1.QuestionNumber = 1 
INNER JOIN Answers AS A1 
     ON A.AnswerId = SA1.AnswerId 
-- Question 2   
INNER JOIN SessionAnswers AS SA2 
     ON SA2.SessionId = S.SessionId 
     AND SA2.QuestionNumber = 2 
INNER JOIN Answers AS A2 
     ON A.AnswerId = SA2.AnswerId 
-- Question 3   
INNER JOIN SessionAnswers AS SA3 
     ON SA3.SessionId = S.SessionId 
     AND SA3.QuestionNumber = 3 
INNER JOIN Answers AS A3 
     ON A.AnswerId = SA3.AnswerId 
-- ...   

이 업데이트는 사용자의 업데이트를 기반으로 작성했습니다. 이전 버전을 보려면 게시물 기록을 확인하십시오.

+0

나는 이것이 내가 이미 가지고있는 것이라고 생각한다. 편집을 참조하십시오, 아직도 명확하지 않습니까? – ediblecode

+1

@danrhul - 업데이트보기 – JDB

+0

당신은 훌륭합니다! – ediblecode

1

선택한 행을 어떻게 처리 하시겠습니까? 계층 적 데이터 FOR XML을 선택하고 구문 분석하기 쉬운 XML 문서를 얻을 수 있습니다. 당신이 열 (변경) 번호 변수를 요구하고 같은

그래서 예를 들어

SELECT dbo.Sessions.SessionId, dbo.Answers.IsCorrect, dbo.Answers.QuestionNumber 
FROM dbo.Answers 
INNER JOIN dbo.SessionAnswers ON dbo.Answers.AnswerId = dbo.SessionAnswers.Answer_AnswerId 
INNER JOIN dbo.Sessions ON dbo.SessionAnswers.Session_SessionId = dbo.Sessions.SessionId 
FOR XML AUTO 
관련 문제