2

我有三张桌子,我已经删除了我的问题不需要的信息,所以这就是为什么它们看起来毫无意义。

会话

SessionId (int) PK

答案

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

会话答案

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

我应该看什么来满足我的目标?我不确定如何在SessionAnswer这里遍历每个

这是我目前看到的在此处输入图像描述::

但我想看到的是:

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

我图片中的 IE 行 1-12 应该都在同一行

4

2 回答 2

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
-- ...        

我根据您的更新重写了这个答案。要查看以前的版本,请查看帖子历史记录。

于 2013-10-10T13:54:18.260 回答
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
于 2013-10-10T14:14:35.887 回答