SQL查询:找出与Numbers PK所有值关联的Numbers FK 2数值
解决方案
假设两张表定义如下:
- 主键表:
numbers,主键字段pk(值为1-10) - 关联表:
relation_table,包含外键字段fk1(关联numbers.pk)、fk2(关联numbers.pk)
以下是几种可行的SQL查询方法:
方法1:分组统计匹配数
通过统计每个fk2关联的不同fk1的数量,判断是否等于numbers表的总记录数(10):
SELECT rt.fk2 FROM relation_table rt GROUP BY rt.fk2 HAVING COUNT(DISTINCT rt.fk1) = (SELECT COUNT(*) FROM numbers);
逻辑:按fk2分组后,统计每组内唯一fk1的数量,只有数量等于主键表总条数的fk2,才关联了所有主键值。
方法2:排除未完全关联的记录
利用NOT EXISTS筛选出不存在任何主键值未关联的fk2:
SELECT DISTINCT rt.fk2 FROM relation_table rt WHERE NOT EXISTS ( SELECT n.pk FROM numbers n WHERE NOT EXISTS ( SELECT 1 FROM relation_table rt2 WHERE rt2.fk2 = rt.fk2 AND rt2.fk1 = n.pk ) );
逻辑:外层遍历每个fk2,内层子查询检查是否存在某个主键值n.pk未与该fk2关联,若不存在这类主键,则该fk2符合条件。
方法3:窗口函数统计总匹配数
通过窗口函数计算每个fk2的关联匹配数,再筛选出匹配数等于主键表总条数的记录:
WITH fk2_match_counts AS ( SELECT rt.fk2, COUNT(DISTINCT rt.fk1) OVER (PARTITION BY rt.fk2) AS match_count, (SELECT COUNT(*) FROM numbers) AS total_pks FROM relation_table rt ) SELECT DISTINCT fk2 FROM fk2_match_counts WHERE match_count = total_pks;
逻辑:先通过CTE计算每个fk2的匹配数和主键表总条数,再筛选匹配数等于总条数的fk2。
内容的提问来源于stack exchange,提问作者Lechius
相关产品推荐
相关产品推荐

