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

Fil*_*vić 2 t-sql combinations permutation sql-server-2008

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

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

例:

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

    Value  (nvarchar(500))
    ------
    Ann
    John
    Mark
Run Code Online (Sandbox Code Playgroud)

编辑#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
Run Code Online (Sandbox Code Playgroud)

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

    id    value    order
    --------------------
    1     Ann      1
    2     John     1
    3     Ann      1
    3     John     2
    4     John     1
    5     Ann      2
Run Code Online (Sandbox Code Playgroud)

笔记:

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

很多搜索在互联网上,我发现后生成排列组合在T-SQL的论坛帖子,但我并没有设法修改它给预期的输出格式,以及迫使它使K = 1,...,N排列也.

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

Mar*_*ith 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
Run Code Online (Sandbox Code Playgroud)

返回

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
Run Code Online (Sandbox Code Playgroud)