为了账号安全,请及时绑定邮箱和手机立即绑定

将常见查询存储为列?

将常见查询存储为列?

呼啦一阵风 2019-10-28 18:31:58
使用PostgreSQL,我有许多查询如下:SELECT <col 1>, <col 2>     , (SELECT sum(<col x>)        FROM   <otherTable>         WHERE  <other table foreignkeyCol>=<this table keycol>) AS <col 3>FROM   <tbl>假设子选择在每种情况下都是相同的,是否有一种方法可以将该子选择存储为表中的伪列?本质上,我希望能够从表A中选择一列,该列是表B中与记录相关的特定列的总和。这可能吗?
查看完整描述

3 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

除了视图之外,您还可以创建一个用于求和的函数。


CREATE FUNCTION sum_other_table( key type_of_key ) RETURNS bigint

AS $$ SELECT sum( col_x ) FROM table_1 where table_1.key = key $$ LANGUAGE SQL;

然后将其用作您的聚合器:


SELECT col_1, col_2, sum_other_table( key ) AS col_3

FROM table_2 WHERE table_2.key = key;

请注意,sum_other_table()的返回类型取决于您要汇总的列的类型。


查看完整回答
反对 回复 2019-10-28
?
米脂

TA贡献1836条经验 获得超3个赞

到目前为止,有三个答案,所有答案都有效。根据情况,其中任何一个都可能是“最佳解决方案”。对于小型表,性能应该非常接近,但是它们都不大可能很好地扩展到具有数百万行的表。使用大型数据集获得理想结果的最快方法可能是(使用Erwin的设置):


SELECT a_id, col1, col2, sum(colx)

FROM tbl_a LEFT JOIN tbl_b b using(a_id)

GROUP BY a_id, col1, col2;

如果将if a_id声明为主键,并且该键在9.1或更高版本下运行,则该GROUP BY子句可以简化,因为col1并且col2在功能上依赖于a_id。


SELECT a_id, col1, col2, sum(colx)

FROM tbl_a LEFT JOIN tbl_b b using(a_id)

GROUP BY a_id;

可以用这种方式定义视图并扩展视图,但是我认为使用函数的方法不会考虑所有相同的执行路径,因此可能不会使用最快的执行路径。


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 525 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信