Maison > base de données > tutoriel mysql > Comment éviter les résultats inattendus de plusieurs appels `array_agg()` imbriqués dans PostgreSQL ?

Comment éviter les résultats inattendus de plusieurs appels `array_agg()` imbriqués dans PostgreSQL ?

Barbara Streisand
Libérer: 2025-01-03 01:17:37
original
292 Les gens l'ont consulté

How to Avoid Unexpected Results from Multiple Nested `array_agg()` Calls in PostgreSQL?

Évitez plusieurs agrégats imbriqués dans les requêtes PostgreSQL

Plusieurs appels array_agg() dans une seule requête peuvent entraîner des résultats inattendus, comme le montre la exemple fourni. Ce problème découle de la jointure de tables comportant plusieurs lignes, créant ainsi un produit cartésien. Pour remédier à ce problème, envisagez les stratégies suivantes :

Agréger d'abord, rejoindre plus tard

Agréger les données de chaque table séparément dans une sous-requête avant de les joindre. Cela garantit que vous agrégez sur un ensemble unique de lignes :

SELECT e.id, e.name, e.age, e.streets, array_agg(wd.day) AS days
FROM (
    SELECT e.id, e.name, e.age, array_agg(ad.street) AS streets
    FROM employees e
    JOIN address ad ON ad.employeeid = e.id
    GROUP BY e.id
) e
JOIN workingdays wd ON wd.employeeid = e.id
GROUP BY e.id, e.name, e.age;
Copier après la connexion

Sous-requêtes corrélées ou JOIN LATERAL

Utilisez des sous-requêtes corrélées ou JOIN LATERAL pour agréger les données de chaque ligne. individuellement, permettant des filtres sélectifs :

Corrélés Sous-requêtes :

SELECT name, age
    , (SELECT array_agg(street) FROM address WHERE employeeid = e.id) AS streets
    , (SELECT array_agg(day) FROM workingdays WHERE employeeid = e.id) AS days
FROM employees e
WHERE e.namer = 'peter';
Copier après la connexion

JOIN LATERAL :

SELECT e.name, e.age, a.streets, w.days
FROM employees e
LEFT JOIN LATERAL (
    SELECT array_agg(street) AS streets
    FROM address
    WHERE employeeid = e.id
    GROUP BY 1
) a ON true
LEFT JOIN LATERAL (
    SELECT array_agg(day) AS days
    FROM workingdays
    WHERE employeeid = e.id
    GROUP BY 1
) w ON true
WHERE e.name = 'peter';
Copier après la connexion

Ces méthodes évitent la duplication inutile de lignes et fournissent les résultats d'agrégation de tableaux souhaités.

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