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 ?
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!