23

Tôi hiện đang có truy vấn SQL trả về một số trường. Tôi cần một f các lĩnh vực để có hiệu quả một phụ truy vấn phụ đó.SQL, Làm cách nào để ghép nối các kết quả?

Vấn đề chi tiết:

Nếu tôi có một bảng X với hai cột, ModuleID và nói ModuleValue, làm thế nào tôi có thể viết một truy vấn SQL để lấy kết quả và nối nó vào một lĩnh vực:

EG Kết quả trở về từ

(SELECT ModuleValue FROM Table_X WHERE [email protected]) 

Giá trị 1

Value 2

Giá trị 3

...

Tôi cần phải trả lại kết quả như vậy (như một hàng duy nhất, không giống như trên):

Giá trị 1, Giá trị 2, Giá trị 3

Có một phương pháp ghép nối đơn giản có thể là người dùng?

EDIT:

DB là MS TSQL (2005)

+0

Bạn có muốn chỉ lấy dữ liệu hoặc cập nhật các trường khác với nó? – Evernoob

+0

Chỉ cần truy xuất, còn MS TSQL – Darknight

Trả lời

26

Với MSSQL bạn có thể làm một cái gì đó như thế này:

declare @result varchar(500) 
set @result = '' 
select @result = @result + ModuleValue + ', ' 
from TableX where ModuleId = @ModuleId 
+0

Cảm ơn! Tôi sẽ cung cấp cho một đi ngay bây giờ, sẽ đánh dấu bạn là trả lời nếu nó hoạt động. – Darknight

+0

Đây là những gì tôi đang tìm kiếm đã làm việc tốt, cảm ơn rất nhiều! – Darknight

+1

CHỌN TRÁI (kết quả @, LEN (@result) -1) AS Txt – suiwenfeng

10

Trong mysql bạn muốn sử dụng chức năng sau:

SELECT GROUP_CONCAT(ModuleValue, ",") FROM Table_X WHERE [email protected] 

Tôi không chắc bạn đang sử dụng phương ngữ nào.

+0

Liên quan vì nó hữu ích cho tôi: http://stackoverflow.com/questions/2567000/mysql-and-group-concat-maximum-length – starryknight64

3

Tùy thuộc vào cơ sở dữ liệu bạn đang sử dụng. MySQL chẳng hạn hỗ trợ hàm (không chuẩn) group_concat. Vì vậy, bạn có thể viết:

SELECT GROUP_CONCAT(ModuleValue) FROM Table_X WHERE [email protected] 

Nhóm concat không có sẵn ở tất cả các máy chủ cơ sở dữ liệu.

6

Trong SQL Server 2005 trở lên, bạn có thể làm một cái gì đó như thế này:

SELECT 
    (SELECT ModuleValue + ',' 
    FROM dbo.Modules 
    FOR XML PATH('') 
    ) 
FROM dbo.Modules 
WHERE ModuleID = 1 

này sẽ cho bạn một cái gì đó giống như những gì bạn đang tìm kiếm.

Marc

+0

có vẻ thú vị, chưa sử dụng nhiều đường dẫn XML. Tôi chắc chắn sẽ chơi với cái này. Cảm ơn! – Darknight

31

Điều này tự động loại trừ dấu phẩy, không giống như hầu hết các câu trả lời khác.

DECLARE @csv VARCHAR(1000) 

SELECT @csv = COALESCE(@csv + ',', '') + ModuleValue 
FROM Table_X 
WHERE ModuleID = @ModuleID 

(Nếu cột ModuleValue chưa được một loại chuỗi sau đó bạn có thể cần phải bỏ nó vào một VARCHAR.)

+0

Cũng lưu ý, trong trường hợp này nó là một varchar, nhưng trong trường hợp khác coule này cũng là các loại giá trị khác. – Darknight

0

cập nhật nhỏ cho Marc chúng tôi sẽ có thêm "" ở kết thúc. tôi đã sử dụng hàm để xóa dấu chấm phẩy phụ.

 SELECT STUFF(( SELECT ',' + ModuleValue AS ModuleValue 
          FROM ModuleValue WHERE [email protected] 
         FOR XML PATH('') 
        ), 1, 1, '') 
Các vấn đề liên quan