Maison >base de données >tutoriel mysql >Comment générer efficacement des listes séparées par des virgules à partir de plusieurs tables SQL ?

Comment générer efficacement des listes séparées par des virgules à partir de plusieurs tables SQL ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-18 22:21:11135parcourir

How to Efficiently Generate Comma-Separated Lists from Multiple SQL Tables?

Intégrez des requêtes SQL pour générer des listes séparées par des virgules

En SQL, il est souvent nécessaire de générer des listes séparées par des virgules à partir des données de plusieurs tables. Par exemple, supposons que vous ayez trois tables : Applications(id,name), Resources(id,name) et ApplicationsResources(id,app_id,resource_id), et que vous souhaitiez créer une table qui affiche tous les noms de ressources, où chaque ligne contient une liste d'applications séparées par des virgules et associées à la ressource.

Le moyen le plus simple consiste à effectuer une requête distincte pour chaque ressource, mais cela est inefficace. Au lieu de cela, nous pouvons exploiter des techniques SQL plus complexes pour y parvenir en une seule requête.

Méthode :

La requête SQL suivante montre comment y parvenir :

MySQL :

<code class="language-sql">SELECT r.name,
         GROUP_CONCAT(a.name SEPARATOR ',')
    FROM RESOURCES r
    JOIN APPLICATIONSRESOURCES ar ON ar.resource_id = r.id
    JOIN APPLICATIONS a ON a.id = ar.app_id
GROUP BY r.name</code>

SQL Serveur (2005) :

<code class="language-sql">SELECT r.name,
       STUFF((SELECT ',' + a.name
               FROM APPLICATIONS a
               JOIN APPLICATIONRESOURCES ar ON ar.app_id = a.id
              WHERE ar.resource_id = r.id
           GROUP BY a.name
            FOR XML PATH(''), TYPE).value('text()[1]','NVARCHAR(max)'), 1, LEN(','), '')
 FROM RESOURCES r</code>

SQL Serveur (2017) :

<code class="language-sql">SELECT r.name,
         STRING_AGG(a.name, ',')
    FROM RESOURCES r
    JOIN APPLICATIONSRESOURCES ar ON ar.resource_id = r.id
    JOIN APPLICATIONS a ON a.id = ar.app_id
GROUP BY r.name</code>

Oracle :

Dans Oracle, les agrégations et jointures de chaînes sont gérées différemment. Veuillez vous référer à la documentation Oracle pour connaître les techniques de traitement de chaînes spécifiques.

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!

Déclaration:
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