Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm cách nào để tạo một hàm SQL Server để nối nhiều hàng từ một truy vấn con vào một trường được phân tách duy nhất?

Nếu bạn đang sử dụng SQL Server 2005, bạn có thể sử dụng lệnh FOR XML PATH.

SELECT [VehicleID]
     , [Name]
     , (STUFF((SELECT CAST(', ' + [City] AS VARCHAR(MAX)) 
         FROM [Location] 
         WHERE (VehicleID = Vehicle.VehicleID) 
         FOR XML PATH ('')), 1, 2, '')) AS Locations
FROM [Vehicle]

Nó dễ dàng hơn nhiều so với sử dụng con trỏ và có vẻ hoạt động khá tốt.

Cập nhật

Đối với bất kỳ ai vẫn sử dụng phương pháp này với các phiên bản SQL Server mới hơn, có một cách thực hiện khác dễ dàng hơn và hiệu quả hơn một chút bằng cách sử dụng STRING_AGG đã có từ SQL Server 2017.

SELECT  [VehicleID]
       ,[Name]
       ,(SELECT STRING_AGG([City], ', ')
         FROM [Location]
         WHERE VehicleID = V.VehicleID) AS Locations
FROM   [Vehicle] V

Điều này cũng cho phép một dấu phân tách khác được chỉ định làm tham số thứ hai, mang lại sự linh hoạt hơn một chút so với phương pháp cũ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để xuất trường hình ảnh sang tệp?

  2. Câu lệnh SQL GROUP BY CASE với hàm tổng hợp

  3. Sự khác biệt giữa Truy vấn con và Truy vấn con có Tương quan

  4. 3 cách để trích xuất năm từ một ngày trong SQL Server (T-SQL)

  5. SQL Server, chuyển đổi một phiên bản được đặt tên thành phiên bản mặc định?