从表中存储表名的表中查询

时间:2015-02-11 12:13:47

标签: sql postgresql

我有一个名为schemas的表,它有:

  • unique_id(varchar) - 包含表名
  • 数据(文字)

unique_id行上的每个schemas都有一个包含相似列的表,例如:users(id,data),holidays(id,data)等..

是否可以从这些表中查询而无需逐个输入?

CREATE TABLE schemas (
  unique_id VARCHAR(32) PRIMARY KEY, // table names stored here
  data TEXT
);
INSERT INTO schemas VALUES('users','foo'),('holidays','bar');
-- not just users and holidays, there are many more..  

CREATE TABLE users ( 
  id BIGSERIAL,
  data TEXT
);
INSERT INTO users(data) VALUES('user1'),('user2'); 

CREATE TABLE holidays (
  id BIGSERIAL,
  data TEXT
);
INSERT INTO holidays(data) VALUES('hol1'),('hol2');
-- and so on, if a record added to the schemas, 
--   a new table created with unique_id name

是否可以在没有PL/*的情况下执行单个查询,该查询可能会产生如下结果:

schema_unique_id | schema_data | table_data
users            | foo         | user1
users            | foo         | user2
holidays         | bar         | hol1
holidays         | bar         | hol2

1 个答案:

答案 0 :(得分:1)

没有动态SQL通常是不可能的。但是,使用您指定的用例,可以使用inheritance

来实现
CREATE TABLE schemas (
  unique_id VARCHAR(32) PRIMARY KEY, 
  data TEXT
);
INSERT INTO schemas VALUES('users','foo'),('holidays','bar');

CREATE TABLE mydata (
  id BIGSERIAL,
  data text
);

CREATE TABLE users ( ) INHERITS (mydata);
INSERT INTO users(data) VALUES('user1'),('user2'); 

CREATE TABLE holidays ( ) INHERITS (mydata); 
INSERT INTO holidays(data) VALUES('hol1'),('hol2');

SELECT s.unique_id, s.data as schema_data, d.data as table_data
FROM schemas s, mydata d, pg_class
WHERE d.tableoid = pg_class.oid AND s.unique_id = pg_class.relname;

 unique_id | schema_data | table_data 
-----------+-------------+------------
 holidays  | bar         | hol1
 holidays  | bar         | hol2
 users     | foo         | user1
 users     | foo         | user2
(4 rows)
来自父表的

SELECT导致PostgreSQL UNION父行的行,其中包含来自每个子表的那些继承列的查询。

如果您的表已经与继承模型兼容,您可以ALTER他们介绍它:

ALTER TABLE users INHERIT mydata;