从函数返回的记录中串联的列
连接两个或多个表中的数据时,必须确保列的正确隔离,以避免数据不一致。但是,某些数据库环境(例如 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中文网其他相关文章!