sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man sammanfogar text från flera rader till en enda textsträng i SQL Server

Om du använder SQL Server 2017 eller Azure, se svaret från Mathieu Renda.

Jag hade ett liknande problem när jag försökte slå samman två bord med en-till-många-relationer. I SQL 2005 hittade jag den XML PATH metod kan hantera sammanfogningen av raderna mycket enkelt.

Om det finns en tabell som heter STUDENTS

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

Resultatet jag förväntade mig var:

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

Jag använde följande 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]

Du kan göra samma sak på ett mer kompakt sätt om du kan sammanfoga kommatecken i början och använda substring för att hoppa över den första så att du inte behöver göra en underfråga:

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. Minska dina databasvärdkostnader:DigitalOcean vs. AWS vs. Azure

  2. Bygga en mycket tillgänglig databas för Moodle med MySQL-replikering

  3. Postgres:välj summan av värden och summera sedan detta igen

  4. Hur man lägger till ett alternativ till sql_mode i MySQL utan att förlora befintliga inställningar