Sql 合并所有子查询中的结果
我有一个postgre表,其表示形式与下面的数据类似 餐饮服务表:Sql 合并所有子查询中的结果,sql,postgresql,Sql,Postgresql,我有一个postgre表,其表示形式与下面的数据类似 餐饮服务表: ----------------------- | Name | Option | ----------------------- | jane | social | | jane | vegan | | jane | gmo-free | | jane | italian | | jack | social | | jack | c
-----------------------
| 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。您只需要根据“动态”标准调整列表。