Sql 合并所有子查询中的结果

Sql 合并所有子查询中的结果,sql,postgresql,Sql,Postgresql,我有一个postgre表,其表示形式与下面的数据类似 餐饮服务表: ----------------------- | Name | Option | ----------------------- | jane | social | | jane | vegan | | jane | gmo-free | | jane | italian | | jack | social | | jack | c

我有一个postgre表,其表示形式与下面的数据类似

餐饮服务表:

-----------------------
| Name    | Option     |
-----------------------
| jane    | social      |
| jane    | vegan       |
| jane    | gmo-free    |
| jane    | italian     |
| jack    | social      |
| jack    | corporate   |
| jack    | gmo-free    |
| jack    | greek       |
| rodz    | social      |
| rodz    | wedding     |
| rodz    | gmo-free    |
| rodz    | vegan       |
| rodz    | french      |
这是我试图运行的“伪”查询

SELECT * FROM caters 
WHERE option is either ['italian', 'french'] 
AND WHERE option is both ['wedding', 'social']
此伪查询应返回
rodz
。因为它既有意大利语也有法语,既有婚礼也有社交活动

这是我试图编写的查询,以完成我的sudo查询

SELECT c.name FROM caters c
WHERE c.option in ('italian', 'french')
GROUP BY c.name
HAVING array_agg(c.option) @> array['wedding', 'social']
无论如何,这都不会返回任何结果。单独运行查询

SELECT c.name FROM caters c
WHERE c.option in ('italian', 'french')
GROUP BY c.name
结果:

-----------
| Name    |
-----------
| jane    | // has italian
| rodz    | // has french
-----------
| Name    |
-----------
| rodz    | // has wedding and social
另一个问题

SELECT c.name FROM caters c
GROUP BY c.name
HAVING array_agg(c.option) @> array['wedding', 'social']
结果:

-----------
| Name    |
-----------
| jane    | // has italian
| rodz    | // has french
-----------
| Name    |
-----------
| rodz    | // has wedding and social
因此,我可以单独看到查询是正确的。这让我思考得很好,如果我有两个查询给了我正确的结果,我只需要过滤掉两个查询中的结果,为什么我不加入它们呢

所以我试过了

SELECT c.name FROM caters c
JOIN caters c1 
ON c1.name = c.name and c1.option = c.option
WHERE c1.option in ('italian', 'french')
GROUP BY c.name
HAVING array_agg(c.option) @> array['wedding', 'social']
但这也没有产生任何结果。你知道我该怎么做吗

注意:每次运行查询时,查询都是动态的。使用的值可能不同,有时可能是5种语言,有时是2种语言,如本例中的
(“意大利语”、“法语”)
。举一个我所说的动态查询的例子,另一个查询可以是

SELECT * FROM caters 
WHERE option is either ['italian'] 
AND WHERE option is both ['corporate', 'social']
// returns none
----------------------------------------------------------
SELECT * FROM caters 
WHERE option is either ['french', 'greek'] 
AND WHERE option is either ['gmo-free', 'vegan'] 
AND WHERE option is both ['corporate', 'social']
// returns jack
----------------------------------------------------------
SELECT * FROM caters WHERE option is ['social']
// returns jack, and rodz

您可以尝试使用相关子查询

select distinct name from tablename a 
where option in ('italian', 'french') and exists
(
  select 1 from tablename b where a.name=b.name and option in ('wedding', 'social')
  group by b.name having count(distinct option)=2
)
输出:

name
rodz
这里有一种方法:

SELECT c.name
FROM caters c
WHERE c.option in ('italian', 'french', 'wedding', 'social')
GROUP BY c.name
HAVING COUNT(*) FILTER (WHERE c.option IN ('italian', 'french')) >= 1 AND
       COUNT(*) FILTER (WHERE c.option IN ('wedding', 'social')) = 2;

我可以调整此查询以使用动态值吗?我更新了我的问题,以便更好地解释我所说的动态values@a_horse_with_no_name哈哈,对不起,英语不是我的第一语言,我没有意识到我有一个
p
和一个
e
伪。更新了拼写错误。我的错误我没有提供查询的所有需要-主要的是动态的。我更新了我的问题以反映这一点。@user10457989。您只需要根据“动态”标准调整列表。