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 ?

Pourquoi les colonnes renvoyées par ma fonction sont-elles concaténées dans une jointure PostgreSQL et comment puis-je y remédier ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-31 18:39:10733parcourir

Why are my function's returned columns concatenated in a PostgreSQL join, and how can I fix it?

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!

Déclaration:
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