Heim >Datenbank >MySQL-Tutorial >Wie verkette ich mehrere Zeilen in einer durch Kommas getrennten Liste in SQL Server und Oracle?

Wie verkette ich mehrere Zeilen in einer durch Kommas getrennten Liste in SQL Server und Oracle?

DDD
DDDOriginal
2025-01-21 06:42:12757Durchsuche

How to Concatenate Multiple Rows into a Comma-Separated List in SQL Server and Oracle?

Zusammenfassen mehrerer SQL-Zeilen in einer einzigen durch Kommas getrennten Spalte

In diesem Artikel wird gezeigt, wie Sie mehrere Zeilen mit einem gemeinsamen Bezeichner in einer einzigen Zeile mit einer durch Kommas getrennten Liste in einer bestimmten Spalte zusammenfassen. Das Beispiel verwendet eine Tabelle mit Ticket-IDs und zugehörigen Personen, um ein Ergebnis zu erstellen, bei dem jede Ticket-ID mit einer Liste aller beteiligten Personen verknüpft ist.

SQL Server-Ansatz (2005 und höher)

Die folgende SQL Server-Abfrage erreicht dies mithilfe von STUFF(), ISNULL() und FOR XML PATH:

<code class="language-sql">SELECT t.TicketID,
       STUFF(ISNULL((SELECT ', ' + x.Person
                FROM @Tickets x
               WHERE x.TicketID = t.TicketID
            GROUP BY x.Person
             FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma],
       ISNULL((SELECT ', ' + x.Person
                FROM @Tickets x
               WHERE x.TicketID = t.TicketID
            GROUP BY x.Person
             FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), '') [Preceeding Comma If Not Empty]
  FROM @Tickets t
GROUP BY t.TicketID</code>

Diese Abfrage verwendet eine Unterabfrage, um mit jedem TicketID verknüpfte Personen zu sammeln. Die FOR XML PATH-Methode wandelt das Ergebnis in eine verkettete Zeichenfolge um und STUFF() entfernt alle führenden Kommas. Die Funktion ISNULL() behandelt Fälle, in denen einem Ticket keine Personen zugeordnet sind. Die optionalen Spalten bieten Flexibilität beim Umgang mit führenden Kommas.

Oracle-Lösung

Oracle bietet eine prägnantere Lösung mit der Funktion LISTAGG():

<code class="language-sql">SELECT TicketID,
       LISTAGG(Person, ',') WITHIN GROUP (ORDER BY Person) OVER (PARTITION BY TicketID) AS People
  FROM @Tickets</code>

LISTAGG() fasst Werte direkt in einer durch Kommas getrennten Liste zusammen, sortiert nach der Spalte Person. Die PARTITION BY-Klausel stellt sicher, dass die Aggregation für jedes einzelne TicketID erfolgt. Diese Methode ist deutlich einfacher und effizienter als das SQL Server-Äquivalent.

Das obige ist der detaillierte Inhalt vonWie verkette ich mehrere Zeilen in einer durch Kommas getrennten Liste in SQL Server und Oracle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn