Select 在多对多关系中使用 ALL 而不是 ANY

Select ALL instead of ANY in a Many-to-Many relationship

目前我们有以下示例数据库结构,在 leadtag 表之间具有多对多关系。

CREATE TABLE lead ( id serial
        constraint lead_id_pk
            primary key, name VARCHAR(20), surname VARCHAR(20) );

CREATE TABLE tag ( id serial
        constraint tag_id_pk
            primary key, name VARCHAR(20), description Text );

create table leads_tags
(
    id         serial
        constraint lead_tags_id_pk
            primary key,
    lead_id    integer not null
        constraint leads_tags_leads_id_fk
            references lead
            on delete cascade,
    tag_id     integer not null
        constraint leads_tags_tags_id_fk
            references tag
            on delete cascade,
    constraint leads_tags_lead_id_tag_id_key
        unique (lead_id, tag_id)
);

假设我们要执行以下查询。

  1. 给我所有在列表中具有 任意 个标签的线索。
  2. 给我所有在列表
  3. 中具有 ALL 个标签的线索

对于第一个(1)我们可以这样做:

Select distinct (id), *
FROM lead
where id in (
    Select lt.lead_id
    from leads_tags lt
    where tag_id in (324, 129)
    )

对于第二个 (2),我们要在其中搜索具有两个标签的潜在客户。根据您的意见,哪个是最高效的选择?这是最好的方法吗?

SELECT *
FROM lead
WHERE id IN (
    SELECT lt.lead_id
    FROM leads_tags lt
    GROUP BY lt.lead_id
    HAVING array_agg(tag_id) @> array [324,129]
)

如果unique (lead_id, tag_id)我会说

SELECT *
FROM lead
WHERE id IN (
    SELECT lt.lead_id
    FROM leads_tags lt
    GROUP BY lt.lead_id
    where tag_id in (324, 129)
    HAVING count(*) = 2
)