我需要一个可以在(或作为)函数中使用的查询,并检索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
注意:
经过大量的互联网搜索后,我发现了Generating Permutations in T-SQL论坛帖子,但我没有设法修改它以提供预期的输出格式,并强迫它使k = 1 ...... n排列也。
对于类似问题有很多解决方案,主要用非SQL语言编写,但我找不到能帮助我解决这个特定问题的问题。
答案 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