Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wybierz z powrotem listę rozdzielaną przecinkami pogrupowaną według identyfikatora

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

Przeanalizowanie zapytania

Główne zapytanie wykonuje group by więc otrzymujesz tylko jeden wiersz dla każdego EntryID .

Kolumna TagsCommaDelimited jest tworzony ze skorelowanym podzapytaniem.

W SQL Server for xml path służy do tworzenia reprezentacji XML wyniku zapytania. Masz dobrą kontrolę nad sposobem tworzenia XML, używając aliasów kolumn i parametrów path i root .

Połączona wartość ', '+T.Name w skorelowanym podzapytaniu nie będzie nazwy kolumny i pustego parametru do for xml path('') tworzy xml bez żadnych tagów. Zostanie zwrócona tylko jedna wartość tekstowa.

Po dodaniu type do for xml zapytanie, typ danych będzie następujący:XML .

Aby uzyskać wartość z XML, należy użyć value() metoda. Możesz rzutować na ciąg, ale jeśli to zrobisz, otrzymasz na przykład & w ciągu wszędzie tam, gdzie użyłeś & .

Pierwszy parametr w value() funkcja to wyrażenie xQuery używane do uzyskania żądanej wartości. Użyj text() aby określić, że chcesz tylko wartość dla bieżącego elementu. [1] mówi SQL Serverowi, że chcesz znaleźć pierwszy węzeł tekstowy (tu masz tylko jeden), ale nadal jest to konieczne.

Ciąg utworzony przez for xml zapytanie zawiera dodatkowy przecinek i spację na początku ciągu, które należy usunąć. Tutaj używam funkcji XQuery substring aby uzyskać wszystko oprócz pierwszych dwóch znaków.

Drugi parametr value() określa typ danych, który powinien zostać zwrócony.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Node.js MSSQL tedius ConnectionError:nie udało się połączyć z hostem lokalnym:1433 - połącz ECONNREFUSED

  2. Odpowiednik MySQL ON DUPLICATE KEY UPDATE w Sql Server

  3. Data i godzina rzutowania SQL

  4. Nie można upuścić obiektu, ponieważ odwołuje się do niego ograniczenie KLUCZA OBCEGO — samouczek SQL Server / TSQL, część 74

  5. Jak złapać wyjątki limitu czasu SQLServer?