2016-10-04 7 views
8

SQL Server-Code, wenn möglich.sql - Suchen Sie nach Kombinationen des Zeichenfolgenwerts einer Spalte

Nehmen wir an, Sie haben eine Tabelle mit zwei Spalten. Spalte 1 genannt Monster und Spalte 2 Ebene genannt:

Monster | Level 
_______________ 
Small Beast | 300 
Large Beast | 700 
Small Dragon | 350 
Large Dragon | 800 

Wie kann ich diese Tabelle abfragen alle möglichen Kombinationen von Spalte 1 zu erhalten: Monster? Bedenke, dass die Anzahl der Monster in der Tabelle schwanken kann.

So würde ausgegeben werden:

Small Beast, Large Beast 
Small Beast, Small Dragon 
Small Beast, Large Dragon 
Large Beast, Small Dragon 
Large Beast, Large Dragon 
Small Dragon, Small Beast, Large Beast 
Large Dragon, Small Beast, Large Beast 

... und so weiter.

dann möchte ich den Summenwert aus Spalte 2 hinzuzufügen: Stufe für alle Monster in der Kombination und geben sie etwa so:

Small Beast, Large Beast: 1000 
Small Beast, Small Dragon: 650 
Large Dragon, Small Beast, Large Beast: 1800 
+0

Werfen Sie einen Blick auf 'CROSS JOINs' für den Anfang. –

Antwort

3

können Sie rekursive CTE verwenden:

;WITH cte AS (
SELECT Monster, 
     [Level], 
     1 as l 
FROM YourTable 
UNION ALL 
SELECT c1.Monster+','+c2.Monster, 
     c1.[Level]+c2.[Level], 
     c1.l+1 
FROM cte c1 
CROSS JOIN YourTable c2 
WHERE c1.Monster NOT LIKE '%'+c2.Monster+'%' 
) 


SELECT * 
FROM cte 
ORDER BY l 
OPTION (MAXRECURSION 0) 

Ausgang:

Monster            Level l 
Small Beast           300  1 
Large Beast           700  1 
Small Dragon          350  1 
Large Dragon          800  1 
Large Dragon,Small Beast       1100 2 
Large Dragon,Large Beast       1500 2 
Large Dragon,Small Dragon       1150 2 
Small Dragon,Small Beast       650  2 
Small Dragon,Large Beast       1050 2 
Small Dragon,Large Dragon       1150 2 
Large Beast,Small Beast        1000 2 
Large Beast,Small Dragon       1050 2 
Large Beast,Large Dragon       1500 2 
Small Beast,Large Beast        1000 2 
Small Beast,Small Dragon       650  2 
Small Beast,Large Dragon       1100 2 
Small Beast,Large Dragon,Large Beast    1800 3 
Small Beast,Large Dragon,Small Dragon    1450 3 
Small Beast,Small Dragon,Large Beast    1350 3 
Small Beast,Small Dragon,Large Dragon    1450 3 
... 
Large Beast,Small Dragon,Large Dragon,Small Beast 2150 4 
Large Beast,Small Dragon,Small Beast,Large Dragon 2150 4 
Small Beast,Small Dragon,Large Dragon,Large Beast 2150 4 
Small Beast,Small Dragon,Large Beast,Large Dragon 2150 4 
Small Beast,Large Dragon,Small Dragon,Large Beast 2150 4 
Small Beast,Large Dragon,Large Beast,Small Dragon 2150 4 
+0

zu implementieren Ich versuchte dies, und musste ein 'CAST()' um das 'c1.Monster + ',' + c2.Monster' Bit wickeln, sonst habe ich Fehler' Typen stimmen nicht zwischen dem Anker und dem rekursiven Teil in der Spalte "Monster" der rekursiven Abfrage "cte" überein. "Nur für den Fall, dass das OP dasselbe bekommt. – Jamiec

+0

@Jamiec In 'YourTable' habe ich' nvarchar (max) 'für' monster' Spalte benutzt. – gofr1

+0

Ah ja - ich hatte 'VARCHAR (500)' verwendet, also musste das Ergebnis auf dasselbe übertragen werden. Sie haben 100% Recht, wenn Sie 'VARCHAR (MAX)' verwenden, gibt es kein Problem und keine Umwandlung erforderlich. Große Antwort BTW! – Jamiec

0

Es gibt einen Weg, es zu tun:

SELECT M1.monster, 
    M2.monster, 
    M1.level + M2.level 
FROM 
    monsters AS M1 
CROSS JOIN 
    monsters AS M2 

Ergebnis:

"Small Beast";"Small Beast";600 
"Small Beast";"Large Beast";1000 
"Small Beast";"Small Dragon";650 
"Small Beast";"Large Dragon";1100 
"Large Beast";"Small Beast";1000 
"Large Beast";"Large Beast";1400 
"Large Beast";"Small Dragon";1050 
"Large Beast";"Large Dragon";1500 
"Small Dragon";"Small Beast";650 
"Small Dragon";"Large Beast";1050 
"Small Dragon";"Small Dragon";700 
"Small Dragon";"Large Dragon";1150 
"Large Dragon";"Small Beast";1100 
"Large Dragon";"Large Beast";1500 
"Large Dragon";"Small Dragon";1150 
"Large Dragon";"Large Dragon";1600 

Die besten Wünsche!

+1

Beachten Sie, dass nach einer Weile 3 Kreaturen pro Reihe erwartet werden. – jarlh

+0

fügen Sie eine Union alle mit einem 3-Wege-Cross hinzu, um die 3-Monster-Kombinationen zu erhalten. – geofftnz

+1

@geofftnz yeah, ich habe auch darüber nachgedacht, aber Sie müssen auch Union mit 4,5, und so weiter Auch es wird verschiedene colums Zahlen haben, so konnte es nicht über Union zusammengeführt werden –

Verwandte Themen