如何在我的sql表上应用多个过滤器
我正在努力解决sql中的关系划分问题。我需要根据多个条件从同一个表中筛选数据。下面是我的表的模式如何在我的sql表上应用多个过滤器,sql,database,postgresql,filter,relational-division,Sql,Database,Postgresql,Filter,Relational Division,我正在努力解决sql中的关系划分问题。我需要根据多个条件从同一个表中筛选数据。下面是我的表的模式 | -------|----------------|-----------------|----------------| |ID |Question |RespondentId |Answer | | -------|----------------|-----------------|----------------| |1 |Bi
| -------|----------------|-----------------|----------------|
|ID |Question |RespondentId |Answer |
| -------|----------------|-----------------|----------------|
|1 |Big |1 |Yes |
|2 |Big |2 |Yes |
|3 |Big |3 |No |
|4 |Gender |1 |Male |
|5 |Gender |2 |Female |
|6 |Gender |3 |Female |
|7 |Children |1 |No |
|8 |Children |2 |Yes |
|9 |Children |3 |No |
--------------------------------------------------------------
我需要从这个名为答案的表格中得到与以下过滤器相匹配的答案:每个问题的答案分别为:问题=大和小,答案=是和是。因此,如果我有一个正确的Sql查询,我的结果应该返回以下数组:[2],因为只有一行对问题Big的答案为Yes,而对问题Children的答案为Yes,这一行的RespondentId=2
此外,提供的问题和答案不是固定的,应该是模块化的。例如,我应该能够更改答案或删除问题,而不必更改查询的整个结构
你能帮我找到这个问题的正确答案吗?我一直在寻找@Erwin Brandstetter提供的许多解释,但没有一个符合我的需要。您可以检查结果,即符合问题和答案where条件的行的计数为2
select RespondentId
from Answers
when question in ( 'Big', 'Children')
and Answer ='Yes'
group by RespondentId having count(*) = 2
我想你要找的是旋转桌子。不同的数据库有不同的语法。您可以有效地将问题列的值转换为它们自己的列,然后查找与您的条件匹配的行 下面是一个标准SQL中效率低下的示例,我为每个问题创建一个表,并使用RespondentId将它们连接到一个表中 从中选择响应者id 从问题=‘大’的答案中选择*作为大 参加 从答案中选择*,其中问题=‘儿童’为儿童 在…上 big.responder\u id=children.responder\u id 哪里 答案=‘是’ 和 答案=‘是’ 我会这样做:
select a.RespondentId
from Answers a
when (question, answer) in ( ('Big', 'Yes'), ('Children', 'Yes') )
group by RespondentId
having count(*) = 2 ;
这很容易概括为:
with qa as (
select v.*
from (values ('Big', 'Yes'), ('Children', 'Yes')
) v(question, answer)
select a.RespondentId
from Answers a join
qa
on a.question = qa.question and a.answer = qa.answer
group by RespondentId
having count(*) = (select count(*) from qa);
这是相当普遍的。您甚至可以安排CTE获取一个数组或json参数,并将其解析为单独的比较值。非常感谢您的回答@scaisEdge,但在这种情况下,如果我想让我对儿童问题的回答为“否”,我会对查询的这种结构感到困惑。@MartinDelobbe。我的答案是对的还是错的??它回答了我问题的第一部分,但不是关于模块化的第二部分。查询是一个查询。。并根据条件进行筛选。。您不能有一个管理所有条件的查询。。这是SQL的思维方式。。您应该深入了解集合论,以便正确地管理SQL,这是肯定的,但您的答案对于我的用例来说太具体了。不过,如果你有其他的解决办法,我会非常高兴!