从函数返回的记录具有串联的列

2023-11-26

我有一个表,用于存储帐户随时间的变化。我需要将其与其他两个表连接起来,以创建特定日期的一些记录(如果这些记录尚不存在)。

为了让事情变得更简单(我希望),我将返回正确历史数据的查询封装到一个接受帐户 ID 和日期的函数中。

如果我执行"Select * account_servicetier_for_day(20424, '2014-08-12')",我得到了预期的结果(从函数返回的所有数据在单独的列中)。如果我在另一个查询中使用该函数,我会将所有列合并为一个:

("2014-08-12 14:20:37",hollenbeck,691,12129,20424,69.95,"2Mb/1Mb 20GB Limit",2048,1024,20.000)

我正在使用“x86_64-slackware-linux-gnu 上的 PostgreSQL 9.2.4,由 gcc (GCC) 4.7.1 编译,64 位”。

Query:

Select
    '2014-08-12' As day, 0 As inbytes, 0 As outbytes, acct.username, acct.accountid, acct.userid,
    account_servicetier_for_day(acct.accountid, '2014-08-12')
From account_tab acct
Where acct.isdsl = 1
    And acct.dslservicetypeid Is Not Null
    And acct.accountid Not In (Select accountid From dailyaccounting_tab Where Day = '2014-08-12')
Order By acct.username

功能:

CREATE OR REPLACE FUNCTION account_servicetier_for_day(_accountid integer, _day timestamp without time zone) RETURNS setof account_dsl_history_info AS
$BODY$
DECLARE _accountingrow record;
BEGIN
  Return Query
  Select * From account_dsl_history_info
  Where accountid = _accountid And timestamp <= _day + interval '1 day - 1 millisecond'
  Order By timestamp Desc 
  Limit 1;
END;
$BODY$ LANGUAGE plpgsql;

一般来说,分解行从函数返回并获取各个列:

SELECT * FROM account_servicetier_for_day(20424, '2014-08-12');


至于查询:

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;

The LATERAL关键字在这里是隐式的,函数总是可以更早地引用FROM items. 手册:

LATERAL也可以在函数调用之前FROM项,但是在这个 如果是干扰词,因为函数表达式可以引用 早些时候FROM任何情况下的物品。

Related:

  • 根据另一个表中的数字在一个表中插入多行

中带逗号的短记号FROM列表(大部分)相当于CROSS JOIN LATERAL(与...一样[INNER] JOIN LATERAL ... ON TRUE),从而从结果中删除函数调用不返回行的行。要保留此类行,请使用LEFT JOIN LATERAL ... ON TRUE:

...
FROM  account_tab a
LEFT  JOIN LATERAL account_servicetier_for_day(a.accountid, '2014-08-12') f ON TRUE
...

另外,不要使用NOT IN (subquery)当你可以避免它的时候。这是几种方法中最慢且最棘手的:

  • 选择其他表中不存在的行

我建议NOT EXISTS反而。

Postgres 9.2 或更高版本

您可以在SELECTlist(这是标准 SQL 的 Postgres 扩展)。出于性能原因,最好在子查询中完成此操作。分解外部查询中的(众所周知的!)行类型,以避免重复计算函数:

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;

Craig Ringer 的相关答案并解释了为什么最好不要在同一查询级别上分解:

  • 如何在 SQL 查询中使用 (func()).* 语法避免多次函数评估?

Postgres 10已删除some集合返回函数的行为中的奇怪之处SELECT:

  • SELECT 子句中多个返回集合的函数的预期行为是什么?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从函数返回的记录具有串联的列 的相关文章

  • 如何查找 PostgreSQL 数据库的上次更新时间?

    我正在使用一个批量更新的 postgreSQL 数据库 我需要知道数据库 或数据库中的表 上次更新或修改的时间 两者都可以 我看到 postgreSQL 论坛上有人建议使用日志记录并查询日志 这对我不起作用 因为我无法控制客户端代码库 你可
  • TOAD 将 &String 视为绑定变量

    我正在使用 Oracle Data Integrator 开发一些 ETL 有时会使用 TOAD 测试部分代码 今天我遇到了 TOAD 的问题 我有一行像 AND column value like DEV PROD 当我尝试运行包含上面过
  • 数据库错误:值对于类型字符变化来说太长(100)

    我有一个 Django 网站 运行我们几年前在内部构建的迷你 CMS 它使用 postgresql 保存简单的标题和一段文本时 出现以下错误 value too long for type character varying 100 奇怪的
  • Oracle 中的 SQL 调优 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何文章 链接可以让我找到 SQL 调优 Oracle 的示例 如果能用例子来解释那就太好了 我需
  • 仅使用扩展方法在 Linq 中进行漂亮、干净的交叉连接 [重复]

    这个问题在这里已经有答案了 可能的重复 使用扩展方法表示的嵌套 from LINQ 查询 https stackoverflow com questions 9115675 nested from linq query expressed
  • 使用Powershell访问远程Oracle数据库

    我需要能够连接到我的网络上基于 Windows 7 的 Oracle 服务器 32 位 Oracle XE 我需要连接的机器运行 Windows 7 64 位 两台机器上都安装了 Powershell 我已在 64 位计算机上安装了 Ora
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • 使用两个日期之间的随机日期时间更新每一行

    我有一个专栏叫date created我希望每一行保存一个随机日期 日期距当前时间为 2 天 我正在运行以下查询 但它会更新具有相同随机日期的所有行 我希望每一行都是随机的并且不相同 update table set date create
  • PHP 绑定“bigint”数据类型(MySQLi 准备好的语句)

    studentId 57004542323382 companyOfferId 7 sql INSERT INTO studentPlacement companyOfferId studentId VALUES if stmt db gt
  • 防止 PostgreSQL 中专有名词的词干?

    以其热情将词干标记转化为词位 http www postgresql org docs current interactive textsearch intro html PostgreSQL全文搜索引擎也减少了专有名词 例如 essais
  • 查找 PostgreSQL 中所有范围集合的所有交集

    我正在寻找一种有效的方法来查找时间戳范围集之间的所有交集 它需要与 PostgreSQL 9 2 配合使用 假设这些范围代表一个人可以见面的时间 每个人都可以有一个或多个空闲时间范围 我想找到all可以召开会议的时间段 即所有人都有空的时间
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • Google Cloud SQL - Postgresql 存储不断增长

    我最近开始修补 Google Cloud SQL PostgreSQL 我创建了一个空数据库 在 4 5 天的时间里 其存储使用量已增长到超过 20GB 它一直在上升 但数据库中没有数据 它甚至没有被使用 有谁知道会发生什么以及如何阻止它
  • 如何在 Visual Studio 中更改 Azure 数据库表的列顺序

    我整个下午都在寻找在 MS Visual Studio 2022 中重新排序 Azure 数据库表列的方法 没有运气 在其他应用程序中 可以通过拖动或剪切和粘贴轻松重新排列列 这里无能为力 此时 我什至不确定可以在 VS 中移动列 我只对
  • 如何在不运行 PostgreSQL 服务器的情况下初始化 PostgreSQL 数据库

    在初始化脚本中 我想初始化 PostgreSQL 目录 但在此阶段不需要 也不希望 正在运行的 PostgreSQL 服务器 如果我只是创建集群 作为用户postgres initdb D 但是 我还需要创建 PostgreSQL 角色 创
  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗
  • 列中差异的数量

    我想检索一列每行中有多少个字母的差异 例如 如果您有一个值 test 而另一行有一个值 testing 则 test 和 testing 之间的差异为 4 个字母 该列的数据值为 4 I have reflected about it an
  • 用户登录时的 Postgresql 触发器

    我正在尝试找出一种方法来了解用户何时登录 Postgres 数据库 有没有办法定义用户登录数据库时触发的触发器 或者是否有一个表或系统视图在任何人登录数据库时都会更新 登录钩子 https github com splendiddata l
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 在 PostgreSQL 中使用月份名称排序

    我有一个表 其中有一个字段 Month Name 它包含月份的名称 我想按月份名称排序 不是按字母顺序 而是按实际顺序 例如一月 二月等 如何使用 PostgreSQL 实现此操作 有什么方法可以将月份名称转换为其数值吗 id billed

随机推荐

  • 使用 python-docx 从 .docx 文件中提取图像位置

    我正在尝试使用以下命令从 docx 文件中获取图像索引python docx图书馆 我能够提取图像的名称 图像的高度和宽度 但不是它在word文件中的索引 import docx doc docx Document filename for
  • Objective-C - 比较整数未按预期工作

    所以我的问题是这样的 我正在从网络接收一个 JSON 字符串 解码时 使用 SBJSON 库 它变成一个 NSDictionary 应该包含键 userid 的某种类型的数字 我说 应该 是因为当我将值与 int NSINTEGER 或 N
  • 同一方法.net core web api上的多种类型[FromBody]

    我有一个带有一个 POST 方法的控制器 它将接收一个可以有 2 种类型的 xml 字符串 例如 HttpPost postObj public async Task
  • 报告(RDLC)本地化/全球化

    VS2010 ASP NET Web 表单 Hi 在报告 RDLC 中 我需要为以下元素提供两种语言 pt BR 和 en US 的本地化 全球化 标签 标题 固定文本 报告查看器 UI 界面 查找 下一个 上一个等控件的按钮和工具提示 根
  • 键盘出现时更改约束 - Swift

    当键盘出现时 我的 UIView 无法正常移动 UIView中有一个UITextView 我用它来输入文本 如果我选择 TextView 输入文本 键盘会出现 但 UIView 第一次不会移动 如果我点击背景并使键盘消失 然后再次点击 Te
  • 请求 URI 太大 [重复]

    这个问题在这里已经有答案了 遇到一个大错误 GET查询大小约 9 000 个符号 它们分为约 10 个变量 Request URI Too Large The requested URL s length exceeds the capac
  • C#:有什么方法可以跳过多态性中的一个基调用吗?

    class GrandParent public virtual void Foo class Parent GrandParent public override void Foo base Foo Do additional work
  • NJ 的 ML 中的嵌套本地声明

    大家好 我有这段代码 local helper f i j local fun NTimesF f n int if n 1 then fn x gt f x else fn x gt f NTimesF f n 1 x in if i l
  • 禁用 Flask 服务器中的控制台消息

    我有一个以独立模式运行的 Flask 服务器 使用app run 但是 我不想在控制台中显示任何消息 例如 127 0 0 1 15 Feb 2013 10 52 22 GET index html HTTP 1 1 200 如何禁用详细模
  • 没有年份的系统日志时间戳?

    我正在将日志回填到 Elasticsearch 中 因此 为了按时间戳中的日志日期创建索引 我使用date像这样过滤 date locale gt en match gt timestamp MMM d HH mm ss MMM dd HH
  • MySQL 和 Java 是否可以在没有文件(即在内存中)的情况下“加载数据”?

    我正在优化将约 10TB 数据导入 MySQL 数据库的过程 目前 我可以在当前笔记本电脑上在大约 14 分钟内导入 2 9GB 0 8GB 索引 该过程包括读取数据文件 Oracle dat 导出 解析数据 将数据写入 CSV 文件并对其
  • 按位运算还实用吗?

    维基百科是唯一真正的知识来源 它指出 在大多数较旧的微处理器上 按位 操作速度略快于 加法和减法运算 并且通常明显快于 乘法和除法 运营 论现代建筑 情况并非如此 按位 操作大体相同 速度作为加法 尽管仍然更快 比乘法 学习按位运算技巧是否
  • seaborn 散点图绘制的日期多于原始数据中存在的日期

    我的数据集包含 2018 年的数据 我尝试绘制一个简单的散点图 由于某种原因 seaborn 绘制了 2000 年至 2018 年的数据 我还没有找到解决方案 Seaborn lineplot 有效 Matplotlib scatter 也
  • 使用自定义主题配置或扩展 log4net SmtpAppender

    如何为生成的电子邮件主题指定布局和转换模式 BufferSize 需要小于或等于 1 这样就不会发生缓冲 代码项目文章log4net NonBufferedSmtpAppenderWithSubjectLayout看起来很有希望 通过继承所
  • 在 python shell 中像 IDLE 一样在 VSCode 中运行 Python

    我很清楚这个话题如何从 Visual Studio Code 中执行 Python 代码 但它们都没有展示如何使用导入的文件运行 gt gt gt python shell 因为我想单独调用函数 我知道我可以通过简单地输入来启动 pytho
  • Python:如何获取列表中项目的排序数量?

    在 Python 中 我有一个项目列表 例如 mylist a a a a b b b d d d c c e 我想输出类似的内容 a 4 b 3 d 3 c 2 e 1 如何输出列表中项目的计数和排行榜 我不太关心效率 只关心任何有效的方
  • Jenkins - env: ‘node’: 没有这样的文件或目录

    我有一个使用配置的詹金斯服务器https github com shierro jenkins docker examples tree master 05 aws ecs 我正在运行一个蓝色海洋使用简单的 Jenkinsfile 和管道j
  • 检测 Android 上的键盘 IME 语言

    如何检测在 EditText 中输入的内容使用哪种语言 我知道 API 13 有getCurrentInputMethodSubtype 但是旧版本的替代品是什么 空无一人 我什至不指望上述内容适用于所有键盘 我写了一个流行的键盘 但不知道
  • Codeigniter - 使用两个不同数据库的最佳方法

    有人知道在我的应用程序中使用两个不同数据库的最佳实践吗 我需要将数据存储在位于不同位置的两个数据库中 主机 用户名 密码 所有这些都会改变 我计划像往常一样创建模型 并在构造中设置数据库主机 名称 通行证等 我不确定你是否称这是 最好 的方
  • 从函数返回的记录具有串联的列

    我有一个表 用于存储帐户随时间的变化 我需要将其与其他两个表连接起来 以创建特定日期的一些记录 如果这些记录尚不存在 为了让事情变得更简单 我希望 我将返回正确历史数据的查询封装到一个接受帐户 ID 和日期的函数中 如果我执行 Select