Maîtriser la concaténation de groupes pour les relations un-à-plusieurs en SQL
Dans les bases de données relationnelles, il est souvent nécessaire de récupérer des informations à partir de tables qui avoir des relations un-à-plusieurs. Un scénario courant consiste à collecter des données sur un enregistrement parent et les enregistrements enfants associés.
Prenons l'exemple d'une table Organisation et d'une table Employé, où chaque organisation peut avoir plusieurs employés. Pour récupérer toutes les informations sur une organisation particulière, ainsi que les prénoms de tous ses employés, nous explorons différentes approches.
Techniques SQL standard
Malheureusement, le SQL standard- 92 et SQL-99 n'incluent pas de fonctions intégrées pour la concaténation de groupes. Des solutions spécifiques au fournisseur sont nécessaires.
MySQL
MySQL propose la fonction GROUP_CONCAT :
SELECT o.ID, o.Address, o.OtherDetails, GROUP_CONCAT(CONCAT(e.FirstName, ' ', e.LastName)) AS Employees FROM Employees e INNER JOIN Organization o ON o.Org_ID = e.Org_ID GROUP BY o.Org_ID;
PostgreSQL
PostgreSQL versions 9.0 et ultérieures fournissent le STRING_AGG fonction :
SELECT o.ID, o.Address, o.OtherDetails, STRING_AGG((e.FirstName || ' ' || e.LastName), ', ') AS Employees FROM Employees e INNER JOIN Organization o ON o.Org_ID = e.Org_ID GROUP BY o.Org_ID;
Oracle
Oracle utilise la fonction LISTAGG :
SELECT o.ID, o.Address, o.OtherDetails, LISTAGG(e.FirstName || ' ' || e.LastName, ', ') WITHIN GROUP (ORDER BY e.FirstName) AS Employees FROM Employees e INNER JOIN Organization o ON o.Org_ID = e.Org_ID GROUP BY o.Org_ID;
Solution de secours
Si les fonctions spécifiques au fournisseur ne sont pas disponibles, des procédures stockées peuvent être créées pour exécuter le concaténation.
Exemple de procédure stockée (générique)
CREATE PROCEDURE MY_CUSTOM_GROUP_CONCAT_PROCEDURE ( @Org_ID INT ) AS BEGIN DECLARE @Employees NVARCHAR(MAX) = ''; SELECT @Employees = @Employees + FirstName + ' ' + LastName + ', ' FROM Employees WHERE Org_ID = @Org_ID; SELECT @Employees = LEFT(@Employees, LEN(@Employees) - 2); RETURN @Employees; END GO;
Utilisation
SELECT o.ID, o.Address, o.OtherDetails, MY_CUSTOM_GROUP_CONCAT_PROCEDURE(o.ID) AS Employees FROM Organization o;
En tirant parti de ces techniques, les développeurs peuvent récupérer efficacement les informations multi-enregistrements associées à un enregistrement, fournissant ainsi une vue globale des données dans un format un-à-plusieurs. relations.
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!