加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Postgresql – 如何在具有相同模式的多个表上运行查询

发布时间:2020-12-13 15:58:19 所属栏目:百科 来源:网络整理
导读:我有一个postgres数据库,有几个表(几百).数据库中表的子集Foo具有相同的模式. 理想情况下,我想创建一个存储过程,它可以针对单个表或针对子集Foo中的所有表运行查询. 伪代码: CREATE TABLE tbl_a (id INTEGER,name VARCHAR(32),weight double,age INTEGER);C
我有一个postgres数据库,有几个表(几百).数据库中表的子集Foo具有相同的模式.

理想情况下,我想创建一个存储过程,它可以针对单个表或针对子集Foo中的所有表运行查询.

伪代码:

CREATE TABLE tbl_a (id INTEGER,name VARCHAR(32),weight double,age INTEGER);
CREATE TABLE tbl_b (id INTEGER,age INTEGER);
CREATE TABLE tbl_c (id INTEGER,age INTEGER);
CREATE TABLE tbl_d (id INTEGER,age INTEGER);

CREATE TYPE person_info AS (id INTEGER,age INTEGER);

CREATE FUNCTION generic_func(ARRAY one_or_more_table_names)
    RETURNS person_info 
    -- Run query on table or all specified tables
    AS $$ $$
    LANGUAGE SQL;

我怎么能在Postgresql 9.x中实现这个要求?

解决方法

你应该看一下PostgreSQL中的 table inheritance,它们完全允许你说的话.

例如,您可以创建表parent_tbl:

CREATE TABLE parent_tbl (id INTEGER,weight numeric,age INTEGER);

然后将表链接到此父表:

ALTER TABLE tbl_a INHERIT parent_tbl;
ALTER TABLE tbl_b INHERIT parent_tbl;
ALTER TABLE tbl_c INHERIT parent_tbl;
ALTER TABLE tbl_d INHERIT parent_tbl;

然后,通过parent_tbl的SELECT查询将查询所有tbl_x表,而对tbl_x的查询将仅查询此特定表.

INSERT INTO tbl_a VALUES (1,'coucou',42,42);

SELECT * FROM tbl_a;
 id |  name  | weight | age 
----+--------+--------+-----
  1 | coucou |     42 |  42
(1 row)

SELECT * FROM parent_tbl;
 id |  name  | weight | age 
----+--------+--------+-----
  1 | coucou |     42 |  42
(1 row)

SELECT * FROM tbl_b;
 id |  name  | weight | age 
----+--------+--------+-----
(0 rows)

也可以从给定的子表中过滤数据.例如,如果您对来自表tbl_a和tbl_b的数据感兴趣,您可以这样做

select id,name,weight,age
from parent_tbl
left join pg_class on oid = parent_tbl.tableoid
where relname in ('tbl_a','tbl_b');

编辑:我把数字换成重量而不是双倍,因为我的服务器不支持这种类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读