将常用查询存储为表列?
查询:
考虑以下 PostgreSQL 查询:
<code class="language-sql">SELECT <col>, <col> , (SELECT sum(<colx>) FROM <othertable> WHERE <otherforeignkeycol> = <thiskeycol>) AS <col> FROM <tbl>;</code>
该子查询在多个查询中保持不变。是否可以将此子查询存储为表的伪列,以便轻松选择表示基于记录关系的表 B 中列的总和的表 A 中的列?
答案:
1. 视图
创建视图是一种有效的解决方案,允许您定义一个虚拟表,其中所需子查询作为其列之一。
2. 计算字段(存储生成的列)
PostgreSQL 11 中引入的存储生成的列满足您的要求。这些允许您定义一个根据其他列的值(包括子查询)动态计算的列。
使用计算字段的实现:
考虑以下表格:
<code class="language-sql">CREATE TABLE tbl_a (a_id int, col1 int, col2 int); CREATE TABLE tbl_b (b_id int, a_id int, colx int);</code>
使用函数创建计算字段:
<code class="language-sql">CREATE FUNCTION col3(a_id INT) RETURNS int8 LANGUAGE sql STABLE AS $func$ SELECT sum(colx) FROM tbl_b b WHERE b.a_id = $func$;</code>
现在,您可以查询:
<code class="language-sql">SELECT a_id, col1, col2, col3(a_id) FROM tbl_a;</code>
说明:
计算字段通过根据表中当前行提供指定列的值来模拟子查询。使用属性表示法访问计算字段(例如,col3(a_id)
)。此技术允许动态检索计算值并保持与 SELECT * 查询的兼容性。 注意,这里修改了函数定义,直接使用a_id
作为参数,避免了使用记录的写法,简化了查询。
以上是我应该将公共子查询存储为 PostgreSQL 中的表列吗?的详细内容。更多信息请关注PHP中文网其他相关文章!