我有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。
如果我可以使用更好的陈述,那也很好。
谢谢。 戴斯蒙德
答案 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);
@>
已包含