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'); 编辑:我把数字换成重量而不是双倍,因为我的服务器不支持这种类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |