您还没有说您正在使用哪个 RDBMS,或者您是否希望将组合限制为集合中的两个元素。
这是一个使用分层查询的 Oracle 答案:
SQL Fiddle
Oracle 11g R2 架构设置:
CREATE TABLE TEST ( COL ) AS
SELECT LEVEL FROM DUAL CONNECT BY LEVEL < 5;
查询 1:
SELECT SUBSTR(SYS_CONNECT_BY_PATH(COL, ','), 2) AS combination
FROM TEST
CONNECT BY PRIOR COL < COL
Results:
| COMBINATION |
|-------------|
| 1 |
| 1,2 |
| 1,2,3 |
| 1,2,3,4 |
| 1,2,4 |
| 1,3 |
| 1,3,4 |
| 1,4 |
| 2 |
| 2,3 |
| 2,3,4 |
| 2,4 |
| 3 |
| 3,4 |
| 4 |
查询 2:
SELECT SUBSTR(SYS_CONNECT_BY_PATH(COL, ','), 2) AS combination
FROM TEST
WHERE LEVEL = 2
CONNECT BY PRIOR COL < COL AND LEVEL <= 2
Results:
| COMBINATION |
|-------------|
| 1,2 |
| 1,3 |
| 1,4 |
| 2,3 |
| 2,4 |
| 3,4 |
还有一个使用递归 CTE 的 SQL Server 版本:
SQL Fiddle
MS SQL Server 2014 架构设置:
CREATE TABLE TEST ( COL INT );
INSERT INTO TEST
SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4;
查询 1:
WITH cte ( combination, curr ) AS (
SELECT CAST( t.COL AS VARCHAR(80) ),
t.COL
FROM TEST t
UNION ALL
SELECT CAST( c.combination + ',' + CAST( t.col AS VARCHAR(1) ) AS VARCHAR(80) ),
t.COL
FROM TEST t
INNER JOIN
cte c
ON ( c.curr < t.COL )
)
SELECT combination FROM cte
Results:
| combination |
|-------------|
| 1 |
| 2 |
| 3 |
| 4 |
| 3,4 |
| 2,3 |
| 2,4 |
| 2,3,4 |
| 1,2 |
| 1,3 |
| 1,4 |
| 1,3,4 |
| 1,2,3 |
| 1,2,4 |
| 1,2,3,4 |