编写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;
逻辑拆解:
UniqueField1分组统计Field1,只保留在表中仅出现一次的值——这类Field1不会对应多个Field2;UniqueField2同理,筛选出仅出现一次的Field2——这类Field2不会对应多个Field1;- 最后将原表与两个结果关联,就能得到同时满足
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;
逻辑拆解:
- 子查询中用窗口函数
COUNT(*) OVER (PARTITION BY ...),分别计算每条记录对应的Field1总关联数、Field2总关联数; - 外层查询直接筛选出两个关联数都等于1的记录,即可得到一对一的关联项。
这两种方法都能准确筛选出你提到的Field1=5对应Field2=c、Field1=8对应Field2=g这两条记录,同时排除那8条多对多的关联数据。
内容的提问来源于stack exchange,提问作者E88
相关产品推荐
相关产品推荐

