postgresql – 将公共查询存储为列?
使用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中记录相关的特定列的总和。这可能吗?
一个 考虑这个测试用例,源自您的描述: CREATE TABLE tbl_a (a_id int,col1 int,col2 int); INSERT INTO tbl_a VALUES (1,1,1),(2,2,2),(3,3,3),(4,4,4); CREATE TABLE tbl_b (b_id int,a_id int,colx int); INSERT INTO tbl_b VALUES (1,5),8),(5,(6,6),(7,11),(8,(9,11); 创建模仿col3的函数: CREATE FUNCTION col3(tbl_a) RETURNS int8 AS $func$ SELECT sum(colx) FROM tbl_b b WHERE b.a_id = $1.a_id $func$ LANGUAGE SQL STABLE; 现在可以查询: SELECT a_id,col1,col2,tbl_a.col3 FROM tbl_a; 甚至: SELECT *,a.col3 FROM tbl_a a; 注意我如何写tbl_a.col3 / a.col3,而不只是col3。这是必要的。 与“virtual column” in Oracle不同,它不会自动包含在SELECT * FROM tbl_a中。你可以使用VIEW。 为什么这个工作? 引用表列的常见方法是使用属性符号: SELECT tbl_a.col1 FROM tbl_a; 调用函数的常用方法是使用函数表示法: SELECT col3(tbl_a); 一般来说,最好坚持这些规范的方式,这符合SQL标准。 但在PostgreSQL中,函数符号和属性符号是等价的。所以这些工作以及: SELECT col1(tbl_a) FROM tbl_a; SELECT tbl_a.col3; More about that in the manual. SELECT *,a.col3 FROM tbl_a AS a; 如果有一个实际的列col3,它优先,系统不会查找该行的函数tbl_a作为参数。 它的美妙之处在于:您可以从tbl_a添加或删除列,最后一个查询将动态返回所有当前列,其中视图只返回创建时存在的列(早期绑定与*的早期绑定)。当然,你必须删除自定义函数,然后才能删除表。并且,在更改表时,必须注意不要使函数无效。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |