如何用SQL实现带过滤的自交叉连接,获取无重复行组合
SQL 获取无重复的两两行组合
假设你的表名为your_table,存储标识(如A、B、C)的列名为id,可以通过自连接+条件过滤实现需求:
通用核心语句(适用于PostgreSQL、Oracle等支持||拼接的数据库)
SELECT t1.id || t2.id AS combination FROM your_table t1 JOIN your_table t2 ON t1.id < t2.id;
不同数据库的适配写法
- MySQL/MariaDB:使用
CONCAT()函数拼接
SELECT CONCAT(t1.id, t2.id) AS combination FROM your_table t1 JOIN your_table t2 ON t1.id < t2.id;
- SQL Server:直接用
+做字符串拼接
SELECT t1.id + t2.id AS combination FROM your_table t1 JOIN your_table t2 ON t1.id < t2.id;
逻辑说明
- 自连接同一个表,用
t1和t2作为别名区分两个实例 t1.id < t2.id的条件一举两得:- 排除了行与自身的连接(
t1.id不会等于t2.id) - 保证每对组合只出现一次(比如只会生成
AB,不会出现BA)
- 排除了行与自身的连接(
- 如果你的标识列不是字符串类型,需要先转换为字符串再拼接,例如PostgreSQL中:
SELECT CAST(t1.id AS VARCHAR) || CAST(t2.id AS VARCHAR) AS combination FROM your_table t1 JOIN your_table t2 ON t1.id < t2.id;
内容的提问来源于stack exchange,提问作者Seaworn
相关产品推荐
相关产品推荐

