首页 >数据库 >mysql教程 >为什么我的函数返回的列在 PostgreSQL 连接中串联起来,如何修复它?

为什么我的函数返回的列在 PostgreSQL 连接中串联起来,如何修复它?

Patricia Arquette
Patricia Arquette原创
2024-12-31 18:39:10758浏览

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

从函数返回的记录中串联的列

连接两个或多个表中的数据时,必须确保列的正确隔离,以避免数据不一致。但是,某些数据库环境(例如 PostgreSQL 9.2.4)可能会遇到从函数返回的列连接成单个列的问题。

问题描述

考虑查询涉及根据帐户 ID 和特定日期从表中检索历史数据的函数的场景。当直接执行该函数时,会按预期返回结果,每一列都包含各自的数据。但是,当在较大的查询中使用该函数时,函数中的列将连接成单个列。这会严重阻碍数据的可读性和分析。

解决方案

要解决此问题,有两种主要方法:

方法 1 :分解行(Postgres 9.3 或较新)

Postgres 9.3 及更高版本引入了 JOIN LATERAL 语法,该语法简化了分解函数返回的行的过程:

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;

方法 2:子查询记录分解(Postgres 9.2 或Older)

对于 Postgres 9.2 及更早版本,另一种方法是使用分解行类型的子查询:

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;

通过实现这些方法,您可以有效地分解从函数返回的行,并确保在 PostgreSQL 中连接表时准确的数据隔离。

以上是为什么我的函数返回的列在 PostgreSQL 连接中串联起来,如何修复它?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn