返回多行匹配条件的Sql查询

返回多行匹配条件的Sql查询,sql,sql-server,linq,Sql,Sql Server,Linq,我有一个调查系统,它包含以下问题答案表格 questionId personId response 1 a red 2 a blue 3 a green 4 a black 1 b red 2 b blue 3 b green 4

我有一个调查系统,它包含以下
问题答案
表格

questionId personId response
1             a       red
2             a       blue
3             a       green
4             a       black
1             b       red
2             b       blue
3             b       green
4             b       black
我需要为搜索表单构造一个查询,允许用户选择要返回的问题和响应。i、 e.用户可以选择问题1答案=红色
和问题3,然后回答绿色

我必须返回符合该标准的
personId
(在上表中,它将返回a和b)

psuedo:从问答表中选择所有personId,其中问题=1&&answer=红色,以及那些personId,其中问题=3,答案为绿色

此代码将在管理员选择“搜索”返回不同的a和b personId后运行


(看起来很简单,但我肯定遗漏了什么?

你如何传递问题ID和回答?假设您最终将它们放入一个表变量中:

    DECLARE @Search TABLE 
    ( questionId int, 
      response varchar(30) ) 
然后,您的SQL变成:

    SELECT q.personID
    FROM questionanswertable AS q
    INNER JOIN @Search AS s
    ON s.questionId = q.questionId
       AND s.response = q.response
    GROUP BY q.personID
    HAVING COUNT(1) = (SELECT COUNT(1) FROM @Search)

我看到您发布了一些伪代码,但您尝试了哪些实际SQL以及结果中有哪些错误?JBrooks可能更接近,因为问题和回答的数量是动态的(从搜索页面中,用户可以根据需要选择尽可能多的问题/答问)…不确定这是否是动态的,请尝试这种方法。我发现它使用您的代码返回搜索表中不同行之间存在OR的结果。我创建了@search table并将其插入以下行中1个红色(应与这些行之间的and类似)3 ggggg reeen使用这些值时,没有与这些条件匹配的行,因此不应返回任何内容。事实上,它会返回与这些行匹配的任何行。对不起,我认为您需要OR。对于所有搜索响应,我将答案改为“和”。
    DECLARE @Search TABLE 
    ( questionId int, 
      response varchar(30) ) 
    SELECT q.personID
    FROM questionanswertable AS q
    INNER JOIN @Search AS s
    ON s.questionId = q.questionId
       AND s.response = q.response
    GROUP BY q.personID
    HAVING COUNT(1) = (SELECT COUNT(1) FROM @Search)
SELECT DISTINCT personId
FROM questionanswer
WHERE questionId IN(SELECT questionId FROM questionanswer WHERE questionId = 1 AND response = 'red')
AND questionId IN(SELECT questionId FROM questionanswer WHERE questionId = 3 AND response = 'green')