Maison >base de données >tutoriel mysql >Pourquoi les colonnes renvoyées par ma fonction sont-elles concaténées dans une jointure PostgreSQL et comment puis-je y remédier ?
Colonnes concaténées dans l'enregistrement renvoyées par la fonction
Lors de la jonction de données de deux tables ou plus, il est essentiel d'assurer une séparation appropriée des colonnes pour éviter incohérences des données. Cependant, certains environnements de base de données, tels que PostgreSQL 9.2.4, peuvent rencontrer des problèmes lorsque les colonnes renvoyées par une fonction sont concaténées en une seule colonne.
Description du problème
Considérez un scénario dans lequel une requête implique une fonction qui récupère les données historiques d'une table en fonction d'un ID de compte et d'une date spécifique. Lorsque la fonction est directement exécutée, les résultats sont renvoyés comme prévu, chaque colonne contenant ses données respectives. Toutefois, lorsque la fonction est utilisée dans une requête plus volumineuse, les colonnes de la fonction sont concaténées en une seule colonne. Cela peut entraver considérablement la lisibilité et l'analyse des données.
Résolution
Pour résoudre ce problème, il existe deux approches principales :
Approche 1 : Décomposition des lignes (Postgres 9.3 ou version ultérieure)
Postgres 9.3 et les versions ultérieures ont introduit la syntaxe JOIN LATERAL, qui simplifie le processus de décomposition des lignes renvoyées par une fonction :
SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes , a.username, a.accountid, a.userid , f.* -- but avoid duplicate column names! FROM account_tab a , account_servicetier_for_day(a.accountid, '2014-08-12') f -- <-- HERE WHERE a.isdsl = 1 AND a.dslservicetypeid IS NOT NULL AND NOT EXISTS ( SELECT * FROM dailyaccounting_tab WHERE day = '2014-08-12' AND accountid = a.accountid ) ORDER BY a.username;
Approche 2 : sous-requête avec décomposition d'enregistrement (Postgres 9.2 ou version antérieure)
Pour les versions 9.2 et antérieures de Postgres, une méthode alternative consiste à utiliser un sous-requête qui décompose le type de ligne :
SELECT '2014-08-12' AS day, 0 AS inbytes, 0 AS outbytes , a.username, a.accountid, a.userid , (a.rec).* -- but be wary of duplicate column names! FROM ( SELECT *, account_servicetier_for_day(a.accountid, '2014-08-12') AS rec FROM account_tab a WHERE a.isdsl = 1 AND a.dslservicetypeid Is Not Null AND NOT EXISTS ( SELECT * FROM dailyaccounting_tab WHERE day = '2014-08-12' AND accountid = a.accountid ) ) a ORDER BY a.username;
En implémentant ces méthodes, vous pouvez décomposer efficacement les lignes renvoyées par les fonctions et garantir une ségrégation précise des données lors de la jointure de tables dans PostgreSQL.
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!