Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да свържете текст от множество редове в един текстов низ в SQL Server

Ако сте на SQL Server 2017 или Azure, вижте отговора на Mathieu Renda.

Имах подобен проблем, когато се опитвах да присъединя две таблици с връзки едно към много. В SQL 2005 открих, че XML PATH метод може да се справи с конкатенацията на редовете много лесно.

Ако има таблица, наречена STUDENTS

SubjectID       StudentName
----------      -------------
1               Mary
1               John
1               Sam
2               Alaina
2               Edward

Резултатът, който очаквах беше:

SubjectID       StudentName
----------      -------------
1               Mary, John, Sam
2               Alaina, Edward

Използвах следния T-SQL :

SELECT Main.SubjectID,
       LEFT(Main.Students,Len(Main.Students)-1) As "Students"
FROM
    (
        SELECT DISTINCT ST2.SubjectID, 
            (
                SELECT ST1.StudentName + ',' AS [text()]
                FROM dbo.Students ST1
                WHERE ST1.SubjectID = ST2.SubjectID
                ORDER BY ST1.SubjectID
                FOR XML PATH ('')
            ) [Students]
        FROM dbo.Students ST2
    ) [Main]

Можете да направите същото нещо по по-компактен начин, ако можете да свържете запетаите в началото и да използвате substring за да пропуснете първата, за да не е необходимо да правите подзаявка:

SELECT DISTINCT ST2.SubjectID, 
    SUBSTRING(
        (
            SELECT ','+ST1.StudentName  AS [text()]
            FROM dbo.Students ST1
            WHERE ST1.SubjectID = ST2.SubjectID
            ORDER BY ST1.SubjectID
            FOR XML PATH ('')
        ), 2, 1000) [Students]
FROM dbo.Students ST2


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL разделен низ въз основа на разделител

  2. Създайте свързан сървър в SQL Server (пример за T-SQL)

  3. TransactSQL, за да стартирате друг TransactSQL скрипт

  4. Функция на SQL Server ROUND():За какво е и защо трябва да ви е грижа?

  5. datetime2 срещу smalldatetime в SQL Server:Каква е разликата?