Maison > base de données > tutoriel mysql > Comment puis-je concaténer efficacement des chaînes de plusieurs lignes dans SQL Server sans utiliser les fonctions FOR XML ou CLR ?

Comment puis-je concaténer efficacement des chaînes de plusieurs lignes dans SQL Server sans utiliser les fonctions FOR XML ou CLR ?

DDD
Libérer: 2025-01-20 09:12:11
original
919 Les gens l'ont consulté

How Can I Efficiently Concatenate Strings from Multiple Rows in SQL Server Without Using FOR XML or CLR Functions?

Méthode de concaténation de chaînes SQL Server

Description du problème :

Vous devez regrouper les chaînes de plusieurs lignes en une seule ligne. COALESCE et FOR XML ne feront pas ce dont vous avez besoin et Azure ne prend pas en charge les fonctions d'agrégation définies par le CLR. Vous devez rechercher la meilleure alternative.

Solution :

À l'aide du Transact SQL standard, vous pouvez concaténer des chaînes efficacement en suivant ces étapes :

  1. Lignes numérotées : Partitionnez les données en fonction de critères de regroupement et attribuez des numéros de ligne dans chaque partition.
  2. Jointure récursive : Créez un CTE récursif qui parcourt la chaîne de jointure en fonction des numéros de ligne.
  3. Filtrer les résultats : Seuls les résultats avec le numéro de ligne le plus élevé sont sélectionnés, garantissant des connexions complètes.

Instructions :

Cette méthode utilise trois CTE :

  • Partitionné : Attribuez des numéros de ligne aux lignes de chaque partition.
  • Concaténé : Construit de manière récursive des chaînes concaténées.
  • Résultat final : Filtre les lignes concaténées pour inclure uniquement les résultats complets.

Pour utiliser cette solution, vous devez préciser des critères de regroupement et de tri. Par exemple, dans votre cas, les lignes portant le même ID sont concaténées et triées par ordre alphabétique.

Exemple :

Considérez les données suivantes :

<code>ID  Name
-- --
1   Matt
1   Rocks
2   Stylus
3   Foo
3   Bar
3   Baz</code>
Copier après la connexion

La requête et sa sortie sont les suivantes :

<code class="language-sql">WITH Partitioned AS
(
    SELECT 
        ID,
        Name,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber,
        COUNT(*) OVER (PARTITION BY ID) AS NameCount
    FROM dbo.SourceTable
),
Concatenated AS
(
    SELECT 
        ID, 
        CAST(Name AS nvarchar(max)) AS FullName, 
        Name, 
        NameNumber, 
        NameCount 
    FROM Partitioned 
    WHERE NameNumber = 1

    UNION ALL

    SELECT 
        P.ID, 
        CAST(C.FullName + ', ' + P.Name AS nvarchar(max)), 
        P.Name, 
        P.NameNumber, 
        P.NameCount
    FROM Partitioned AS P
        INNER JOIN Concatenated AS C 
                ON P.ID = C.ID 
                AND P.NameNumber = C.NameNumber + 1
)
SELECT 
    ID,
    FullName
FROM Concatenated
WHERE NameNumber = NameCount;</code>
Copier après la connexion
<code>ID  FullName
-- ------------------------------
2   Stylus
3   Bar, Baz, Foo
1   Matt, Rocks</code>
Copier après la connexion

Description de l'amélioration : Remplacez le type nvarchar par nvarchar(max) pour prendre en charge des résultats de concaténation de chaînes plus longs. Cela évite les erreurs potentielles de dépassement de longueur de chaîne.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal