获得k值的所有排列(k = 1 ... n)

时间:2011-11-23 08:47:33

标签: sql-server-2008 tsql permutation combinations

我需要一个可以在(或作为)函数中使用的查询,并检索n个值的所有排列。我需要长度为k的所有排列,其中k = 1..n。

编辑#1:扩展样本输入和结果,因此输入有3个值而不是2个 - 但是,输入值的数量可能从1到n不等。

示例:

输入:包含多行一列值的表

    Value  (nvarchar(500))
    ------
    Ann
    John
    Mark

编辑#2:我可以使用以下任何输出

输出#1:在一列中连接值的表

    Ann
    John
    Ann,John
    John,Ann
    Ann,Mark
    Mark,Ann
    John,Mark
    Mark,John
    Ann,John,Mark
    Ann,Mark,John
    John,Ann,Mark
    John,Mark,Ann
    Mark,Ann,John
    Mark,John,Ann

输出#2:id为排列/组合,值和顺序的表

    id    value    order
    --------------------
    1     Ann      1
    2     John     1
    3     Ann      1
    3     John     2
    4     John     1
    5     Ann      2

注意:

  • 必须适用于SQL Server 2008 R2
  • 必须在函数
  • 内工作
  • 输入中预期的不同元素的最大数量不应超过5 - 如果这对性能或任何其他原因有影响
  • 输入表中的值列长度不得超过200个字符 - 如果这对性能或任何其他原因有影响

经过大量的互联网搜索后,我发现了Generating Permutations in T-SQL论坛帖子,但我没有设法修改它以提供预期的输出格式,并强迫它使k = 1 ...... n排列也。

对于类似问题有很多解决方案,主要用非SQL语言编写,但我找不到能帮助我解决这个特定问题的问题。

1 个答案:

答案 0 :(得分:8)

;WITH Names(Name) As
(
SELECT 'Ann' UNION ALL
SELECT 'John' UNION ALL
SELECT 'Mark' 
), R(Name,Lvl) AS
(
SELECT CAST(',' + Name AS VARCHAR(MAX)), 1
FROM Names
UNION ALL
SELECT R.Name + ',' + N.Name, Lvl + 1
FROM R JOIN Names N ON R.Name + ',' NOT LIKE '%,' + N.Name + ',%'
)
SELECT STUFF(Name,1,1,'') AS Name
FROM R
ORDER BY Lvl, Name

返回

Name
------------------------------
Ann
John
Mark
Ann,John
Ann,Mark
John,Ann
John,Mark
Mark,Ann
Mark,John
Ann,John,Mark
Ann,Mark,John
John,Ann,Mark
John,Mark,Ann
Mark,Ann,John
Mark,John,Ann