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

如何编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:15:39