6

我有三个包含以下数据的表

表3 :

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

表 2:

Table2_id        Name
1                A
2                B
3                C

表格1 :

Table1_id        Name
1                P
2                Q
3                R

我有一个问题,我需要返回所有 table1_id,其中包含表 3 中所有 Table2_id 的条目。
即。我希望我的输出是

Table1_id
1

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

4

3 回答 3

3

在带有 a 的子选择中使用NOT INwith LEFT JOINexcludeCROSS 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,则会是什么样子。table1table2

一个(自然的)左连接table3将告诉我们哪些关系真正存在。过滤where t3.Table1_id is null(排除LEFT JOIN)我们得到缺失的关系。将该结果用于NOT IN子句,我们只得到与 table2 没有缺失关系的 table1 项目。

于 2016-03-28T09:42:39.520 回答
2

您可以使用以下查询:

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)

从in获取Table1没有完整条目集的记录。然后使用得到预期的结果。Table2Table3NOT IN

于 2016-03-28T09:00:09.987 回答
0

这是使用EXISTSand的解决方案INNER 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 )
于 2016-03-28T09:52:57.847 回答