2014-01-07 63 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進行測試。