连接所有组合

时间:2019-05-03 09:41:44

标签: sql combinations permutation

假设我有一个包含3行的表:ABC

DECLARE @t TABLE (col varchar(1))
INSERT @t 
    SELECT 'A' UNION
    SELECT 'B' UNION
    SELECT 'C'

我想将三个值连接起来,选择所有可能的组合:

A;B;C;
A;C;B;
B;A;C;
B;C;A;
C;A;B;
C;B;A;

此查询为我提供了第一个组合:A;B;C;

SELECT STUFF(
(
    SELECT t1.col + ';'
    FROM @t AS t1
    --CROSS JOIN @t AS t2
    FOR XML PATH('')
),1,0,'') AS List

如果我取消对CROSS JOIN的注释,我将得到: A;B;C;A;B;C;A;B;C;

但是很明显,这不是我想要的;-)首先,它成一排。第二,它始终是相同的组合(A;B;C;A;B;C;A;B;C;),而我正在寻找A;B;C;B;C;A;C;A;B;

1 个答案:

答案 0 :(得分:2)

这不是一种通用的方法(您没有指定在sql server中测试过的dbms),但确实返回了所有组合:

DECLARE @t TABLE (col varchar(1))
INSERT @t 
    SELECT 'A' UNION
    SELECT 'B' UNION
    SELECT 'C'


SELECT  CONCAT(T.col, ';', T2.col, ';', T3.col, ';') AS list
FROM    @t AS T
CROSS JOIN @t AS T2
CROSS JOIN @t AS T3 
WHERE   T2.col <> T.col
    AND T3.col <> T.col
    AND T3.col <> T2.col

返回:

+--------+
|  list  |
+--------+
| B;A;C; |
| C;A;B; |
| A;B;C; |
| C;B;A; |
| A;C;B; |
| B;C;A; |
+--------+