0

我有两张表,一张包含问题(被认为是“模板”):

|QuestionID|QuestionText      |
|----------|------------------|
|1         |What is your name?|
|2         |What is your age? |
|-----------------------------|

还有一个包含这些问题的答案,由一个单独的客户 ID 值键入:

|CustID    |QuestionID|Answer |
|----------|------------------|
|1000      |1         |John   |
|1000      |2         |22     |
|2000      |1         |Alice  |
|-----------------------------|

如您所见,客户 #1000 回答了问题 1 和 2,客户 #2000 只回答了问题 1。

我需要由客户将这些加载到网页上的网格中,我想我只需在模板和答案表之间进行左外连接即可获得如下内容:

|CustID    |QuestionID|Answer |
|----------|------------------|
|2000      |1         |Alice  |
|2000      |2         |<null> |
|-----------------------------|

因此,在这种情况下,cust #2000 将返回Answer问题 #2 的列为空,并且应用程序将知道需要回答它。这是我尝试过的 SQL 的一个示例,但无论我使用多少个OUTER等组合,我都无法让它与单个查询一起使用:LEFTJOIN

select 
    q.QuestionID,
    q.QuestionText,
    a.CustID,
    a.Answer,
from 
    SurveyAnswers a  
        full outer join SurveyQuestions q
        on a.QuestionID = q.QuestionID
    where 
        a.CustID = @CustomerID

基本上我需要表中的所有记录,以及与 CustomerID 匹配的任何记录中SurveyQuestions的列值。AnswerSurveyAnswers

相反,我只得到一个SurveyAnswers有答案的记录,因此是匹配的(我猜?)在SurveyQuestions. 我的 SQL-fu 不强。

我也试过UNION和朋友们,但两张桌子有不同的结构,所以效果不太好。

我当然可以分别提取问题和答案,并在我的 C# 代码中进行“合并”,但我想看看是否可以直接从存储过程中进行。谢谢!

4

1 回答 1

1

您遇到的问题是,在对不匹配的行(示例中的问题 2)进行外连接之后,不匹配表(SurveyAnswers)的该行的所有列的值都为 NULL。这包括 CustId 列。稍后执行的 WHERE 会看到 NULL = @CustomerId 并排除该行。要解决这个问题,您需要将条件移动到连接子句中。因此,如果存在这样的答案,您需要向 SQL Server 询问所有问题以及“@CustomerId”给出的每个问题的答案。您的查询要求(所有问题及其所有答案),但仅返回“@CustomerId”回答的那些记录。

SELECT 
    q.QuestionID,
    q.QuestionText,
    a.CustID,
    a.Answer,
FROM 
    SurveyAnswers a  
        RIGHT outer join SurveyQuestions q
        on a.QuestionID = q.QuestionID
    AND
        a.CustID = @CustomerID;

应该做的伎俩。

于 2012-10-15T22:21:33.413 回答