猿问

将常见查询存储为列?

使用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中与记录相关的特定列的总和。这可能吗?


呼啦一阵风
浏览 526回答 3
3回答

陪伴而非守候

除了视图之外,您还可以创建一个用于求和的函数。CREATE FUNCTION sum_other_table( key type_of_key ) RETURNS bigintAS $$ 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_3FROM table_2 WHERE table_2.key = key;请注意,sum_other_table()的返回类型取决于您要汇总的列的类型。

米脂

到目前为止,有三个答案,所有答案都有效。根据情况,其中任何一个都可能是“最佳解决方案”。对于小型表,性能应该非常接近,但是它们都不大可能很好地扩展到具有数百万行的表。使用大型数据集获得理想结果的最快方法可能是(使用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;可以用这种方式定义视图并扩展视图,但是我认为使用函数的方法不会考虑所有相同的执行路径,因此可能不会使用最快的执行路径。
随时随地看视频慕课网APP
我要回答