2016-10-04 4 views
8

Код SQL Server, если это возможно.sql - Найти комбинации строкового значения столбца

Предположим, у вас есть стол с двумя колонками. Колонка 1 называется Монстр и Column 2 называется Уровень:

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

Как я могу запросить эту таблицу, чтобы получить все возможные комбинации Колонка 1: Монстр? Имейте в виду, что количество монстров в таблице может колебаться.

Так результат будет:

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 

... и так далее.

Я тогда хотел бы добавить значение суммы из колонки 2: Уровень для всех монстров в комбинации и выводить их, как так:

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

Посмотрите на 'CROSS JOINs' для начинающих. –

ответ

3

Вы можете использовать рекурсивное ОТВ:

;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) 

Выход:

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

Я пробовал это, и мне пришлось обернуть 'CAST()' вокруг 'c1.Monster + ',' + c2.Monster', иначе я получил ошибку' Типы не совпадают между якорем и рекурсивной частью в столбце «Монстр» рекурсивного запроса «cte». «На всякий случай OP становится тем же. – Jamiec

+0

@Jamiec В 'YourTable' я использовал' nvarchar (max) 'для столбца' monster'. – gofr1

+0

Ах да - я использовал 'VARCHAR (500)', поэтому пришлось отдать результат тому же. Вы на 100% правы, если используете 'VARCHAR (MAX)' нет проблем и не требуется броска. Отличный ответ BTW! – Jamiec

0

Существует способ сделать это:

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

Результат:

"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 

С наилучшими пожеланиями!

+1

Заметка, что через некоторое время ожидают 3 существа. – jarlh

+0

добавьте союз с 3-сторонним крестиком, чтобы получить комбинации 3-монстров. – geofftnz

+1

@geofftnz да, я тоже подумал об этом, но вы также должны объединиться с 4,5 и т. Д. Также у него будут разные номера колонок, поэтому он не может быть объединен через union –

 Смежные вопросы

  • Нет связанных вопросов^_^