2016-10-04 22 views
8

Mã máy chủ SQL, nếu có thể.sql - Tìm các kết hợp giá trị chuỗi của cột

Giả sử bạn có một bảng có hai cột. Cột 1 được đặt tên Monster và cột 2 được đặt tên Level:

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

Làm thế nào tôi có thể truy vấn bảng này để có được tất cả các kết hợp có thể có của cột 1: Quái vật? Hãy nhớ rằng số lượng quái vật trong bảng có thể dao động.

Vì vậy, đầu ra sẽ là:

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 

... và vân vân.

sau đó tôi muốn thêm các giá trị tổng từ Cột 2: Cấp cho tất cả quái vật trong sự kết hợp và xuất chúng như vậy:

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

Hãy xem 'CHÉO JOINs' cho người mới bắt đầu. –

Trả lời

3

Bạn có thể sử dụng đệ quy CTE:

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

Output:

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

Tôi đã thử này, và đã phải quấn một 'CAST()' xung quanh 'c1.Monster + ',' + c2.Monster' bit nếu không tôi đã nhận lỗi' Các loại không khớp giữa neo và phần đệ quy trong cột "Monster" của truy vấn đệ quy "cte" .' Chỉ trong trường hợp OP nhận được như vậy. – Jamiec

+0

@Jamiec Trong 'YourTable' tôi đã sử dụng' nvarchar (max) 'cho cột' monster'. – gofr1

+0

À vâng - Tôi đã sử dụng 'VARCHAR (500) 'do đó đã phải đưa kết quả vào cùng một kết quả. Bạn hoàn toàn đúng 100% nếu bạn sử dụng 'VARCHAR (MAX)' không có vấn đề gì và không cần sử dụng. Câu trả lời tuyệt vời BTW! – Jamiec

0

Có một cách để làm điều đó:

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

Kết quả:

"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 

Lời chúc tốt nhất!

+1

Lưu ý rằng 3 sinh vật mỗi hàng được mong đợi sau một thời gian. – jarlh

+0

thêm một liên minh tất cả với một sự tham gia chéo 3 chiều để có được sự kết hợp 3 quái vật. – geofftnz

+1

@geofftnz yeah, tôi cũng đã nghĩ về nó, nhưng bạn cũng phải kết hợp với 4,5, và như vậy trên Ngoài ra nó sẽ có số colums khác nhau, vì vậy nó không thể được sáp nhập qua công đoàn –

Các vấn đề liên quan