You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:50:25