【问题标题】:Return all possible combinations of values within a single column in SQL返回 SQL 中单个列中所有可能的值组合
【发布时间】:2019-07-04 19:57:52
【问题描述】:

如何从数据库“x”的同一列中返回所有可能的值组合的列表?例如我有:

    col 1,
    1
    2
    3
    4

我想返回所有可能组合的列表,例如,

    1,2
    1,3
    1,4
    2,3,
    2,4
    3,4

....

【问题讨论】:

  • 你所有的价值观都不同吗?你能不能拥有a=1,b=1,c=2 并想返回{a=1,b=1, a=1,c=2, b=1,c=2}?

标签: sql


【解决方案1】:

您还没有说您正在使用哪个 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 |

【讨论】:

    【解决方案2】:
    select concat(t1.id, ",", t2.id) from t t1 join t t2 on t1.id < t2.id;
    

    可以在here 找到一个 SQL Fiddle 示例。

    concat(t1.id, ",", t2.id)
    -------------------------
    1,2
    1,3
    1,4
    2,4
    2,3
    3,4
    

    【讨论】:

    • 很好的答案,简单有效,只是一点,根据条件可以将join的条件更改为t1.id t2.id
    • @MohsenSichani - 不,&lt;&gt; 将同时允许 1,22,1,从而产生排列而不是组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2022-01-12
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多