Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 用于从包含模板和不同项数的表中读取的联接类型?_Sql Server_Join - Fatal编程技术网

Sql server 用于从包含模板和不同项数的表中读取的联接类型?

Sql server 用于从包含模板和不同项数的表中读取的联接类型?,sql-server,join,Sql Server,Join,我有两个表格,一个包含问题(被视为“模板”): 其中包含这些问题的答案,由单独的客户ID值键入: |CustID |QuestionID|Answer | |----------|------------------| |1000 |1 |John | |1000 |2 |22 | |2000 |1 |Alice | |-----------------------------| 如您所见,客户1

我有两个表格,一个包含问题(被视为“模板”):

其中包含这些问题的答案,由单独的客户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> |
|-----------------------------|
基本上,我需要
SurveyQuestions
表中的所有记录,以及
SurveyAnswers
中与CustomerID匹配的任何记录中的
Answer
列的值

相反,我只是在
SurveyAnswers
中得到一条记录,该记录有答案,因此在
SurveyQuestions
中是匹配的(我猜是?)。我的意志力不强

我还尝试了
UNION
和friends,但这两个表的结构不同,所以效果不太好


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

您遇到的问题是,在不匹配行上的外部联接(示例中的问题2)之后,不匹配表(SurveyAnswers)中该行的所有列的值都为NULL。其中包括CustId列。稍后执行的WHERE将看到NULL=@CustomerId并排除该行。要解决这个问题,您需要将条件移动到join子句中。因此,如果存在由“@CustomerId”给出的所有问题的答案,您需要询问SQL Server。您的查询正在询问(所有问题及其答案),但只返回“@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;

你应该做到这一点。

是的!成功了。从未想过
join
表达式可能有多个条件:\n非常感谢!
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
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;