2011-07-06 31 views
11

Im sử dụng mã từ this MSDN page để tạo tổng hợp do người dùng xác định để nối các chuỗi với group by's trong máy chủ SQL. Một trong những yêu cầu của tôi là thứ tự của các giá trị được ghép nối giống như trong truy vấn. Ví dụ:Thứ tự tổng hợp được xác định bởi người dùng SQL được giữ nguyên?

Value Group 
1  1 
2  1 
3  2 
4  2 

Sử dụng truy vấn

SELECT 
    dbo.Concat(tbl.Value) As Concat, 
    tbl.Group 
FROM 
    (SELECT TOP 1000 
    tblTest.* 
    FROM 
    tblTest 
    ORDER BY 
    tblTest.Value) As tbl 
GROUP BY 
    tbl.Group 

sẽ dẫn đến:

Concat Group 
"1,2" 1 
"3,4" 2 

kết quả này dường như luôn luôn đi ra chính xác và như mong đợi, nhưng hơn tôi tình cờ gặp this page mà các tiểu bang rằng đơn đặt hàng không được bảo đảm và thuộc tính đó SqlUserDefinedAggregateAttribute.IsInvariantToOrder chỉ được sử dụng để sử dụng trong tương lai.

Vì vậy, câu hỏi của tôi là: Có đúng không khi giả định rằng các giá trị được ghép nối trong chuỗi có thể kết thúc theo bất kỳ thứ tự nào?
Nếu trường hợp đó xảy ra thì tại sao mã ví dụ trên trang MSDN sử dụng thuộc tính IsInvariantToOrder?

+0

Không thể trả lời câu hỏi của bạn MS, nhưng 'GROUP_CONCAT' cho phép bạn xác định được về nối. –

+0

@kerrek - lưu ý rằng thẻ này được gắn thẻ 'SQL Server' không phải' MySQL' – JNK

+0

Tôi e rằng không có 'GROUP_CONCAT' trong SQL server 2008 – Magnus

Trả lời

5

tôi nghi ngờ một vấn đề lớn ở đây là tuyên bố của bạn "giống như trong truy vấn" - tuy nhiên, truy vấn của bạn bao giờ định nghĩa (và không thể xác định) một trật tự bởi những điều được tổng hợp (bạn có thể trật tự nhiên các nhóm , bằng cách có một số ORDER BY sau GROUP BY). Ngoài ra, tôi chỉ có thể nói rằng nó dựa hoàn toàn vào một số đặt (chứ không phải là một chuỗi được đặt hàng) và rằng về mặt kỹ thuật đơn đặt hàng thực sự không được xác định.

+0

+1 - Tìm kiếm 'Thứ tự SQL' trên SO và bạn sẽ nhận được rất nhiều bài đăng về các vấn đề tương tự. – JNK

+0

Bạn có thể chỉ định 'order by' nếu bạn có câu lệnh' top' của một lựa chọn bên trong và so với nhóm theo đó. – Magnus

+0

@Marc Tôi đã cập nhật câu hỏi của mình bằng truy vấn đang sử dụng lựa chọn bên trong với câu lệnh 'top' và' order by'. Kết quả cuối cùng của việc sử dụng nhóm và 'Concat' trên đó vẫn có thứ tự không xác định? – Magnus

1

Trong khi câu trả lời được chấp nhận là chính xác, tôi muốn chia sẻ cách giải quyết khác mà người khác có thể thấy hữu ích. Cảnh báo: nó liên quan đến việc không sử dụng tổng hợp do người dùng xác định :)

Liên kết dưới đây mô tả một cách thanh lịch để tạo danh sách được phân tách bằng cách sử dụng lệnh SELECT và biến varchar. Nhược điểm (cho chủ đề này) là bạn có thể chỉ định thứ tự các hàng được xử lý. Nhược điểm là bạn không thể dễ dàng ghép nối trên nhiều tập con khác nhau của các hàng mà không lặp lại đau đớn.

Không hoàn hảo, nhưng đối với trường hợp sử dụng của tôi là giải pháp tốt.

http://blog.sqlauthority.com/2008/06/04/sql-server-create-a-comma-delimited-list-using-select-clause-from-table-column/

+0

Mặc dù không thể sử dụng với nhóm như trong câu hỏi của tôi. – Magnus

+0

Đúng, chính xác - đó là những gì tôi đã cố gắng để có được bằng cách nói "nhược điểm là ..." –

+0

Làm thế nào bạn sẽ chỉ định một đơn đặt hàng trong trường hợp này? Nếu đây là bên trong một khung nhìn hoặc chức năng, nó vẫn không thể xác định một đơn đặt hàng, làm cho điều này vô dụng. –

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