使用 all() 或 exists() 返回一个 table 的 ID,其中其他 table 的所有值都与此 ID 存在

Returning ids of a table where all values of other table exist with this id using all() or exists()

我有三个表,其中包含以下数据

Table 3 :

Table1_id        Table2_id
1                1
1                2
1                3
2                1
2                3
3                2

Table 2 :

Table2_id        Name
1                A
2                B
3                C

Table 1 :

Table1_id        Name
1                P
2                Q
3                R

我有一个问题,我需要 return 所有 table1_id 的 Table 3 中的所有 Table2_ids 的条目。
即。我希望我的输出是

Table1_id
1

我找到了使用 count() 的解决方案。 但是有没有办法使用 all() 或 exists() 来解决查询呢?

您可以使用以下查询:

SELECT DISTINCT t1.*
FROM Table2 AS t2
CROSS JOIN Table1 AS t1
WHERE NOT EXISTS (SELECT 1
                  FROM Table3 AS t3
                  WHERE t1.Table1_id = t3.Table1_id AND        
                        t2.Table2_id = t3.Table2_id)

获取 Table1 条不包含 Table2Table3 的完整条目集的记录。然后使用NOT IN得到预期的结果。

在带有 CROSS JOIN

的子选择中使用 NOT IN 并排除 LEFT JOIN
select *
from table1
where Table1_id not in (
    select t1.Table1_id
    from table1 t1
    cross join table2 t2
    left join table3 t3 using (Table1_id, Table2_id)
    where t3.Table1_id is null
)

VS 使用 COUNT()

select table1_id 
from table3 
group by table1_id 
having count(1) = (select count(1) from table2)

解释:

CROSS JOIN

    select t1.Table1_id
    from table1 t1
    cross join table2 t2

表示 table3 的样子,如果 table1 中的每个项目都与 table2 中的每个项目相关。

table3 的(自然)左连接将向我们展示哪些关系确实存在。通过 where t3.Table1_id is null(不包括 LEFT JOIN)过滤,我们得到缺失的关系。将该结果用于 NOT IN 子句,我们只得到与 table2 没有缺失关系的 table1 项目。

这是使用 EXISTSINNER JOIN 的解决方案。

SELECT DISTINCT t3_out.Table1_id FROM Table3 t3_out
WHERE EXISTS( SELECT 1
    FROM Table2 t2 INNER JOIN Table3 t3 ON t2.Table2_id = t3.Table2_id
    WHERE t3.Table1_id = t3_out.Table1_id
    HAVING COUNT(DISTINCT t2.Table2_id) = 3 )