Maison > base de données > tutoriel mysql > Comment concaténer efficacement des données provenant de relations un-à-plusieurs dans SQL ?

Comment concaténer efficacement des données provenant de relations un-à-plusieurs dans SQL ?

Susan Sarandon
Libérer: 2024-12-29 12:02:12
original
155 Les gens l'ont consulté

How to Efficiently Concatenate Data from One-to-Many Relationships in SQL?

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;
Copier après la connexion

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;
Copier après la connexion

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;
Copier après la connexion

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;
Copier après la connexion

Utilisation

SELECT
  o.ID,
  o.Address,
  o.OtherDetails,
  MY_CUSTOM_GROUP_CONCAT_PROCEDURE(o.ID) AS Employees
FROM
  Organization o;
Copier après la connexion

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!

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