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
编辑#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
笔记:
很多搜索在互联网上,我发现后生成排列组合在T-SQL的论坛帖子,但我并没有设法修改它给预期的输出格式,以及迫使它使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