Comment puis-je créer une liste séparée par des virgules à l'aide d'une requête SQL?
J'ai 3 tables appelé:
- Applications (id, nom)
- Ressources (id, nom)
- ApplicationsResources (id, app_id, resource_id)
Je veux afficher sur une interface graphique, un tableau de tous les noms de ressource. Dans une cellule de chaque ligne je voudrais la liste de toutes les applications (séparés par des virgules) de la ressource.
La question est donc, quelle est la meilleure façon de le faire en SQL que j'ai besoin d'obtenir toutes les ressources, et j'ai aussi besoin d'obtenir toutes les applications pour chaque ressource?
Dois-je exécuter un select * from ressources d'abord et ensuite une boucle sur chaque ressource et faire une requête distincte pour chaque ressource pour obtenir la liste des applications pour cette ressource?
Est-il une manière que je peux le faire en une seule requête?
- La base de données que vous utilisez?
- je voudrais que ma solution pour être agnostique db
- La manipulation des chaînes n'est pas très db agnostique.
- Voir aussi stackoverflow.com/questions/1048209/...
- Ce produit de base de données et la version?
- Il est sql server 2008
- Vous avez peut-être nouveau, DONC n'oubliez pas de upvote des réponses utiles et d'accepter celui qui est le plus utile pour vous.
Vous devez vous connecter pour publier un commentaire.
Il n'y a aucun moyen de le faire dans la base de données de façon agnostique.
Si vous avez besoin d'obtenir l'ensemble des données comme ceci:
Et alors concat la AppName par programme, lors du regroupement par ResName.
MySQL
SQL Server (2005+)
SQL Server (2017+)
Oracle
Je recommande lecture sur la chaîne d'agrégation/concaténation dans Oracle.
GROUP_CONCAT(a.name, ', ')
À l'aide de FUSIONNER pour Construire la Chaîne Délimitée par des Virgules dans SQL Server
http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string
Exemple:
Je ne sais pas si il n'y a aucune solution pour le faire dans une base de données de façon agnostique, car vous allez probablement avoir besoin d'une forme de manipulation de chaîne, et ceux-ci sont en général différentes entre les vendeurs.
Pour SQL Server 2005, vous pouvez utiliser:
Il utilise le SQL Server 2005
FOR XML PATH
construire à la liste de points (les demandes pour une ressource donnée) comme une liste séparée par des virgules.Marc
Je crois que ce que vous voulez, c'est:
SELECT ItemName, GROUP_CONCAT(DepartmentId) FROM table_name GROUP BY ItemName
Si vous utilisez MySQL
Référence
En supposant que SQL Server:
Structure de la Table:
Requête:
Résultats:
Je pense que nous pourrions écrire de la façon suivante pour récupérer(code ci-dessous est juste un exemple, s'il vous plaît modifier si nécessaire):
De la prochaine version de SQL Server vous serez en mesure de faire
Pour les versions précédentes du produit il y a une assez grande variété de différentes approches à ce problème. Une excellente revue d'entre eux est dans l'article: Concaténant les Valeurs de Ligne de Transact-SQL.
De la concaténation des valeurs lorsque le nombre d'éléments ne sont pas connus
.
Non-fiable approches
MySQL
**
MS SQL Server
Oracle
Être agnostique, goutte dos et plate.
Maintenant l'utilisateur de votre serveur langage de programmation pour concaténer a_names tout r_name est le même que la dernière fois.
Cela fera dans SQL Server: