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

Chọn lại danh sách được phân tách bằng dấu phẩy được nhóm theo ID

select ET1.EntryID,
       (
       select ', '+T.Name
       from Tags as T
         inner join EntryTag as ET2
           on T.TagID = ET2.TagID
       where ET1.EntryID = ET2.EntryID
       for xml path(''), type
       ).value('substring(text()[1], 3)', 'varchar(max)') as TagsCommaDelimited
from EntryTag as ET1
group by ET1.EntryID

Phân tích truy vấn

Truy vấn chính thực hiện một nhóm group by vì vậy bạn chỉ nhận được một hàng cho mỗi EntryID .

Cột TagsCommaDelimited được tạo bằng một truy vấn con tương quan.

Trong SQL Server, for xml path được sử dụng để tạo biểu diễn XML của một kết quả truy vấn. Bạn có quyền kiểm soát tốt cách XML được tạo bằng cách sử dụng bí danh cột và các tham số đến pathroot .

Giá trị được nối ', '+T.Name trong truy vấn con được corelated sẽ không có tên cột và tham số trống đến for xml path('') tạo xml mà không có bất kỳ thẻ nào cả. Sẽ chỉ có một giá trị văn bản được trả về.

Khi bạn thêm type thành for xml truy vấn kiểu dữ liệu sẽ là XML .

Để lấy giá trị từ XML, bạn nên sử dụng giá trị value() phương pháp. Bạn có thể truyền sang một chuỗi nhưng nếu làm như vậy, chẳng hạn bạn sẽ nhận được & trong chuỗi bất cứ nơi nào bạn đã sử dụng & .

Tham số đầu tiên trong value() hàm là biểu thức xQuery được sử dụng để nhận giá trị bạn muốn. Sử dụng text() để chỉ định rằng bạn chỉ muốn giá trị cho phần tử hiện tại. [1] nói với SQL Server rằng bạn muốn tìm thấy nút văn bản đầu tiên (bạn chỉ có một nút ở đây) nhưng nó vẫn cần thiết.

Chuỗi được tạo bởi for xml truy vấn có thêm dấu phẩy và khoảng trắng ở đầu chuỗi và cần được xóa. Ở đây tôi sử dụng hàm XQuery substring để lấy mọi thứ trừ hai ký tự đầu tiên.

Tham số thứ hai cho value() chỉ định kiểu dữ liệu sẽ được trả về.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CUBE OLAP đa chiều là gì và cho ví dụ về hình khối có nhiều hơn 3 kích thước

  2. hành vi nối nvarchar / chỉ mục / nvarchar (tối đa) không thể giải thích được

  3. Khái niệm cơ bản về Nhật ký giao dịch SQL Server

  4. Liệt kê tất cả cơ sở dữ liệu từ một máy chủ được liên kết trong SQL Server (Ví dụ T-SQL)

  5. Tạo tập hợp các ngày tăng dần trong TSQL