首页 文章

Postgres匹配所有数组值与相同的列和条件---更新

提问于
浏览
2

我有table table_a,其中包含以下列

id  event_id
1   101
1   102
1   103
2   105
2   103
2   106

我和搜索(101,103)和条件类似于IN查询与OR条件

例如,id 1匹配101和103 event_id;

为此,我写下面的查询,但它不起作用 .

select * from table_a where event_id = ALL(ARRAY[101,103]);

UPDATED--------------------------- 我还有另外一个问题

假设id是另一个具有这种关系的表event_categories的外来者 .

id      parent_id
101     null
102     101
103     101
104     null
105     104

所以我想从table_a中获取基于AND的记录和父事件类别,或者在该父项的子事件类别中 .

例如101,104与AND 102,103在OR的OR之内

2 回答

  • 1

    您需要为单个ID聚合所有event_ids:

    select id
    from table_a
    group by id
    having array_agg(event_id) @> array[101,103];
    

    @> 是包含运算符,因此它检查所有event_ids的数组是否包含具有这两个ID的数组 .

    这将返回任何至少包含两个事件101和103的id(这是您在问题中要求的) .

    如果您想查找那些具有 exactly 这两个event_ids(您的示例数据不包含)的ID,您可以使用:

    select id
    from table_a
    group by id
    having array_agg(distinct event_id order by event_id) = array[101,103];
    

    请注意,数组中元素的顺序对 = 运算符很重要(与"contains" @> 运算符不同)

  • 1

    使用 HAVING 子句:

    SELECT t.id 
    FROM YourTable
    WHERE event_id IN(101,103)
    GROUP BY t.id
    HAVING COUNT(distinct event_id) = 2
    

相关问题