2014-01-07 65 views
1

我有了这个示例表:用不同的颜色生成TSQL色数排列

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脚本来产生这个排列。先谢谢你!

+0

是G1 G2 R1还是R1 R2 R3可能的结果?或者有效的结果是否需要每种颜色的一个球? – GregA100k

+0

有效的结果仅适用于每个颜色的球 – G10

回答

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' 
+0

我需要一个可扩展的解决方案......您的一个只能使用三种颜色...... :( – G10

+0

从不建议使用类似隐式联接的sql反模式。 – HLGEM

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, @[email protected] OUTPUT 
EXEC (@SQL2) 

this SQL-Fiddle进行测试。