【问题标题】:Concatenate all combinations [duplicate]连接所有组合[重复]
【发布时间】:2023-04-06 09:20:01
【问题描述】:

假设我有一个包含 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;

【问题讨论】:

  • 所有可能的组合,但C;B;A 等在哪里?
  • 很好,@jarlh! :-)
  • 看看这个。这是完全相同的问题,因为“所有组合”被称为 Permutationsstackoverflow.com/questions/3621494/…
  • 某人突然将值D插入表中的预期结果是什么?

标签: sql combinations permutation


【解决方案1】:

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

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; |
+--------+

【讨论】:

  • 感谢您的回答!这恰好适用于三行。所以 eyp,这就是我所要求的...... :-) 我没有提到:我需要它来处理 4 或 5 或 n 值。所以,如果我添加 4 这个答案不起作用。
  • 正确,这就是我的意思,它不是一个非常笼统的方法。如果你想使用这种方法,我想你必须使用动态 sql。
  • 链接副本有更灵活的方法。
猜你喜欢
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多