搜索2个postgres array_agg以找到相同的项目

时间:2019-06-14 08:00:22

标签: arrays postgresql subquery

我有2个array_agg,一个“搜索条件”和一个“所有列表”:

我用来获取array_agg的代码:

“搜索条件”

SELECT ARRAY_AGG(DISTINCT n_id) as agg_n FROM pn WHERE n_id IN (100,101)

结果:

{100,101}

“所有列表”

SELECT p_id, ARRAY_AGG(DISTINCT n_id) AS agg_n_2 FROM pn GROUP BY p_id

结果:

1 | {100,101}
2 | {100,101,102}
3 | {100,102}
4 | {101,103}
5 | {100,101,102,103}

子查询正常运行。如果我要求它返回所有n_id都为100和101的p_id(根据请求)。仅应返回1时,它只会返回1,2,5。如果我的请求只是{100},它将不会返回任何内容,而我需要它返回1,2,3,5

完整的SQL在下面。我该怎么做?我知道上面的前2个子查询应该是正确的,但是如何构造整体查询?

WITH pn_o AS (SELECT p_id, ARRAY_AGG(DISTINCT n_id) AS agg_n FROM pn GROUP BY p_id),
      n_o AS (SELECT ARRAY_AGG(DISTINCT n_id) as agg_n_2 FROM pn WHERE n_id IN (100)) 
SELECT p_id FROM pn WHERE pn_o.agg_n = (SELECT n.agg_n_2 FROM n_o);

我尝试了=,并且尝试了IN(这会引发错误)。我不能使用ANY,因为它不是OR条件,而是AND。

一个pn表的示例(它只有2列,并且n_id和p_id都是不同的外键):

p_id | n_id
-----+-----
100  | 100
100  | 101
100  | 102
100  | 103
101  | 100
101  | 102
101  | 105

我要查找的是与n_id相关联的p_id,无论它是1个还是多个n_id。

如果我可以使用更好的陈述,那也很好。

谢谢。 戴斯蒙德

1 个答案:

答案 0 :(得分:0)

好的,刚输入完这个问题,我就找到了答案。我已经对其进行了测试,并且可以正常工作。

因此,对于任何想要使用1条语句执行此操作的人,就是这样。

WITH pn_o AS (SELECT p_id, ARRAY_AGG(DISTINCT n_id) AS agg_n FROM pn GROUP BY p_id),
     n_o AS (SELECT ARRAY_AGG(DISTINCT n_id) as agg_n_2 FROM pn WHERE n_id IN (100)) 
SELECT p_id FROM pn WHERE pn_o.agg_n @> (SELECT n.agg_n_2 FROM n_o);

@>已包含

https://www.postgresql.org/docs/11/functions-array.html