SQL中如何从3个CHAR变量列表中获取全部两两组合
SQL获取三个变量所有有序两两配对的实现方法
实现逻辑
你需要的是3个元素中取2个的有序不重复排列,SQL中可以通过自笛卡尔连接+等值过滤实现:
- 第一步先将A、B、C三个变量构造为可查询的多行数据集
- 对数据集做自连接,排除两个元素相等的场景,即可得到所有符合要求的配对
通用SQL写法(兼容绝大多数SQL方言)
-- 先构造存储三个变量的临时结果集 WITH value_list AS ( SELECT 'A' AS item UNION ALL SELECT 'B' AS item UNION ALL SELECT 'C' AS item ) -- 自连接过滤得到有序配对 SELECT CONCAT(t1.item, ',', t2.item) AS pair FROM value_list t1 CROSS JOIN value_list t2 WHERE t1.item <> t2.item;
输出结果
执行上述代码后会返回6条结果,完全覆盖你提到的所有场景:
A,B
A,C
B,A
B,C
C,A
C,B
可选调整
如果你需要的是无序两两组合(即A,B和B,A视为同一种仅保留一条),仅需要修改WHERE条件即可:
WHERE t1.item < t2.item
修改后会返回3条结果:A,B、A,C、B,C。
简化写法(适用于PostgreSQL/MySQL 8.0+/Oracle等支持VALUES行构造的数据库)
不需要写CTE,直接用VALUES构造数据集即可:
SELECT CONCAT(t1.item, ',', t2.item) AS pair FROM (VALUES ('A'), ('B'), ('C')) t1(item) JOIN (VALUES ('A'), ('B'), ('C')) t2(item) ON t1.item <> t2.item;
内容的提问来源于stack exchange,提问作者David_M
相关产品推荐
相关产品推荐

