首页 > 数据库 > mysql教程 > 我应该将公共子查询存储为 PostgreSQL 中的表列吗?

我应该将公共子查询存储为 PostgreSQL 中的表列吗?

Patricia Arquette
发布: 2025-01-11 18:46:42
原创
587 人浏览过

Should I Store Common Subqueries as Table Columns in PostgreSQL?

将常用查询存储为表列?

查询:

考虑以下 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板