生成tsql color-number Permutation

时间:2014-01-07 15:22:50

标签: sql-server algorithm tsql permutation

我有这个示例表:

CREATE TABLE Balls 
(
    BallId  int primary key identity(1,1)   NOT NULL,
    Color   char(1) NOT NULL,
    Number  int NOT NULL
)

我有不同颜色的球,每个球都有一个数字。表格中的数据示例:

BallId  Color   Number
4       G       1
9       G       2
1       R       1
2       R       2
3       R       3
5       W       1
6       W       2
7       W       3
8       W       4

我需要所有不同球的所有排列(在这种情况下为G-R和W)与数字。 例如:

G1 R1 W1
G1 R1 W2
G1 R1 W3 
G1 R1 W4
G1 R2 W1
...
G2 R3 W4

“G1 R1 W1”等于“R1 G1 W1”(顺序无关紧要)。 我需要tsql脚本来生成这种排列。提前谢谢!

2 个答案:

答案 0 :(得分:0)

除非您采取措施限制结果,否则连接表将产生排列。

select g.color, g.number, r.color, r.number, w.color, w.number

from Balls g, Balls r, Balls w
where g.color = 'G' 
  and r.color = 'R'
  and w.color = 'W'

答案 1 :(得分:0)

使用动态SQL来提供可扩展的解决方案:

DECLARE @sql NVARCHAR(MAX), @sql2 NVARCHAR(MAX), @Parm NVARCHAR(30)
SET @sql = N'SELECT @SQL2 = ''SELECT ''+STUFF((SELECT DISTINCT '', T''+COLOR+''.COLOR'' + ''+CAST(T''+ COLOR +''.NUMBER AS NVARCHAR(2))''  as ''data()'' FROM Balls FOR XML PATH('''')),1,2,'''')'+' (SELECT DISTINCT ''FROM ''+STUFF((SELECT DISTINCT '', Balls T''+COLOR ''data()'' FROM Balls FOR XML PATH('''')),1,2,'''')) +'' WHERE ''+ STUFF((SELECT DISTINCT '' AND T''+ COLOR +''.COLOR'' + '' = '' +  + '''''''' + COLOR + '''''''' as ''data()'' FROM Balls FOR XML PATH('''')),2,3,'''')    '
SET @Parm = N'@SQL2 varchar(MAX) OUTPUT'
EXECUTE sp_executesql @SQL, @Parm, @SQL2=@SQL2 OUTPUT
EXEC (@SQL2)

请参阅this SQL-Fiddle进行测试。