假设我有一个包含3行的表:A
,B
,C
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;
答案 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; |
+--------+