Maison > base de données > tutoriel mysql > Comment puis-je concaténer de manière optimale des chaînes dans SQL Azure sans fonctions d'agrégation CLR ?

Comment puis-je concaténer de manière optimale des chaînes dans SQL Azure sans fonctions d'agrégation CLR ?

Mary-Kate Olsen
Libérer: 2025-01-20 09:16:10
original
533 Les gens l'ont consulté

How Can I Optimally Concatenate Strings in SQL Azure Without CLR Aggregate Functions?

Solution de connexion efficace pour les chaînes SQL Azure

Dans SQL Azure, il est essentiel d'agréger efficacement des données de chaîne disparates en une seule entité. En raison du manque de fonctions d'agrégation personnalisées CLR dans SQL Azure, des alternatives efficaces doivent être trouvées.

Solution Transact SQL

Un moyen efficace consiste à utiliser la clause WITH et le CTE (Common Table Expression) récursif. Cette méthode comprend :

  1. Utilisez ROW_NUMBER() et PARTITION BY pour numéroter les lignes de la partition et définir l'ordre de jointure.
  2. Utilisez le CTE récursif (concaténé) de manière itérative pour construire la chaîne concaténée.
  3. Filtrez les résultats pour inclure uniquement les résultats agrégés finaux (où NameNumber = NameCount).

Description

Veuillez considérer la demande suivante :

<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

Exemple

Pour 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

Renvoie les résultats globaux suivants :

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

Avantages

  • Pour SQL Azure
  • Relativement efficace, en particulier pour les ensembles de données plus petits
  • Facile à personnaliser pour des scénarios de connexion spécifiques (par exemple, ordre de tri, séparateurs)

Remarque : afin d'éviter le dépassement de longueur du type de données nvarchar, modifiez le type de CAST en nvarchar(max). De plus, le tri dans les résultats de l'exemple est légèrement différent du texte original. En effet, la base de tri de ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) est le champ Nom, ce qui entraîne des différences dans les résultats de tri. Si vous avez besoin d'une méthode de tri spécifique, modifiez la clause ORDER BY.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal