Sql server 2008 获取k值的所有排列(k=1…n)

Sql server 2008 获取k值的所有排列(k=1…n),sql-server-2008,tsql,permutation,combinations,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

我需要一个查询,它可以用于(或作为)一个函数,并检索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个字符-如果这对性能或任何其他原因很重要的话
在互联网上进行了大量搜索后,我找到了论坛线程,但我没有设法修改它以提供预期的输出格式,也没有强迫它进行k=1…n排列

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

;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

你试过什么?可能是一个具有约束的n向自联接,所选字段彼此不相等?@RaymondHettinger:我试图修改所述链接中的代码。还试图修改其他各种解决方案,但许多文章的作者误解了排列和组合。这是两者的混合。像多重交叉连接一样的N-连接?不,它不起作用,因为我不知道前面的值的数量(如问题k=1…n中所述)。那么可能会很倒霉。我不知道有任何参数化SQL查询返回可变长度的字段数。@RaymondHettinger:我知道可变数量的返回列查询无法写入。我需要在一列中串联值,如所述。但我可以接受返回三个字段的解决方案:排列id、排列中的值和顺序,这样我就可以很容易地识别排列中的值(只需编辑我的帖子以包含此输出)您需要查询吗?存储过程呢?Martin,这是完美的解决方案,非常感谢!似乎我把我的T-SQL代码复杂化了。@Filippović我假设您的实际数据不包含任何对
类似的
运算符具有特殊意义的逗号或字符。如果不是这样,则可能需要调整。Martin,数据是某个表的列名。在我的例子中,将有带下划线的列。我做了一个快速测试,对于我的特定测试用例,它正在工作,但如果您能调整您的查询,我将非常感激。提前感谢。@Filippović-只需将连接条件从CHARINDEX上的R连接名称N(','+N.Name+',',R.Name+','1)=0更改为