微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个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');

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐