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

编写SQL查询从多对多关联表中筛选一对一关联记录

从多对多关联表中筛选一对一记录的SQL方案

针对你提到的需求——从Table1中找出仅存在一对一关联的记录(也就是Field1唯一对应一个Field2,且Field2也唯一对应这个Field1),这里有两种实用的SQL写法,都能精准定位到你说的那两条目标记录:

方法一:使用CTE(公共表表达式)筛选唯一值

这种方法逻辑清晰、容易理解,适合刚接触复杂查询的场景:

WITH UniqueField1 AS (
    -- 找出所有仅出现一次的Field1值(无多对多关联的Field1)
    SELECT Field1
    FROM Table1
    GROUP BY Field1
    HAVING COUNT(*) = 1
),
UniqueField2 AS (
    -- 找出所有仅出现一次的Field2值(无多对多关联的Field2)
    SELECT Field2
    FROM Table1
    GROUP BY Field2
    HAVING COUNT(*) = 1
)
-- 关联原表与两个筛选结果,得到同时满足一对一的记录
SELECT t.Field1, t.Field2
FROM Table1 t
JOIN UniqueField1 uf1 ON t.Field1 = uf1.Field1
JOIN UniqueField2 uf2 ON t.Field2 = uf2.Field2;

逻辑拆解:

  1. UniqueField1 分组统计Field1,只保留在表中仅出现一次的值——这类Field1不会对应多个Field2;
  2. UniqueField2 同理,筛选出仅出现一次的Field2——这类Field2不会对应多个Field1;
  3. 最后将原表与两个结果关联,就能得到同时满足Field1唯一、Field2唯一的一对一记录。

方法二:使用窗口函数(性能更优的写法)

如果你的表数据量较大,窗口函数的性能会更出色,因为它只需要遍历一次表:

SELECT Field1, Field2
FROM (
    SELECT 
        Field1, 
        Field2,
        -- 统计当前Field1对应的总关联记录数
        COUNT(*) OVER (PARTITION BY Field1) AS f1_assoc_count,
        -- 统计当前Field2对应的总关联记录数
        COUNT(*) OVER (PARTITION BY Field2) AS f2_assoc_count
    FROM Table1
) subquery
-- 筛选出两个关联数都为1的记录
WHERE f1_assoc_count = 1 AND f2_assoc_count = 1;

逻辑拆解:

  1. 子查询中用窗口函数COUNT(*) OVER (PARTITION BY ...),分别计算每条记录对应的Field1总关联数、Field2总关联数;
  2. 外层查询直接筛选出两个关联数都等于1的记录,即可得到一对一的关联项。

这两种方法都能准确筛选出你提到的Field1=5对应Field2=c、Field1=8对应Field2=g这两条记录,同时排除那8条多对多的关联数据。

内容的提问来源于stack exchange,提问作者E88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:17:41