使用 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
条不包含 Table2
中 Table3
的完整条目集的记录。然后使用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 项目。
这是使用 EXISTS
和 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 )
我有三个表,其中包含以下数据
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
条不包含 Table2
中 Table3
的完整条目集的记录。然后使用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 项目。
这是使用 EXISTS
和 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 )