【问题标题】:Query from tables where the table names are stored on a table从表名存储在表中的表中查询
【发布时间】:2015-04-11 19:25:33
【问题描述】:

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

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

schemas 行上的每个unique_id 都有一个具有相似列的表,例如: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

【问题讨论】:

  • 是的,有可能。但是:如果您的表名或列名是变量,您将需要动态 SQL。 (这至少意味着plpgsql)
  • 如果没有某种非 SQL 编程(无论是 PL/* 还是与数据库对话的程序),就无法动态生成 SQL。

标签: sql postgresql


【解决方案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;

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 2014-05-07
    • 2012-08-18
    • 2021-03-20
    • 2015-03-09
    • 2014-10-23
    • 1970-01-01
    • 2019-04-09
    • 2012-11-06
    相关资源
    最近更新 更多