如何编写SQL查询选取数据表中呈镜像重复的行?
选取镜像重复行的SQL查询方案
要找出表中互为镜像的行(即存在另一行,其两列值与当前行恰好互换),可以用以下几种SQL实现方式:
方法一:使用EXISTS子查询
直接检查每一行是否存在对应的镜像行,返回所有符合条件的记录:
SELECT t1.* FROM mirror_table t1 WHERE EXISTS ( SELECT 1 FROM mirror_table t2 WHERE t2.Table1 = t1.Table2 AND t2.Table2 = t1.Table1 AND t1.Table1 != t2.Table1 -- 可选:排除Table1与Table2值相同的行 )
- 逻辑说明:对每一行
t1,检查是否存在行t2满足两列值互换;添加t1.Table1 != t2.Table1可避免把Table1=Table2的行误判为镜像行(不需要排除这类行可删除该条件)。
方法二:使用自连接
通过自连接匹配镜像行,返回所有符合的记录:
SELECT DISTINCT t1.* FROM mirror_table t1 JOIN mirror_table t2 ON t1.Table1 = t2.Table2 AND t1.Table2 = t2.Table1 WHERE t1.Table1 != t2.Table1 -- 可选:排除自身相等的行
- 逻辑说明:将表与自身连接,匹配镜像条件;用
DISTINCT避免重复返回同一行(表中无重复行时可省略)。
方法三:分组匹配镜像组合
先找出所有存在镜像对的数值组合,再关联回原表获取完整行:
SELECT mt.* FROM mirror_table mt JOIN ( -- 生成按大小排序的数值组合,筛选出现至少两次的组合(即存在镜像对) SELECT LEAST(Table1, Table2) AS val1, GREATEST(Table1, Table2) AS val2 FROM mirror_table GROUP BY val1, val2 HAVING COUNT(*) >= 2 ) pairs ON (mt.Table1 = pairs.val1 AND mt.Table2 = pairs.val2) OR (mt.Table1 = pairs.val2 AND mt.Table2 = pairs.val1)
- 逻辑说明:子查询用
LEAST和GREATEST统一每一行的两个值排序,分组后筛选出存在镜像对的组合,再关联原表得到所有对应镜像行。
验证示例
针对你提供的测试表,以上三种方法都会返回第1、3、5、8行(即(12,20)、(20,12)、(54,34)、(34,54)),符合需求。
内容的提问来源于stack exchange,提问作者Lechius
相关产品推荐
相关产品推荐

