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

标签 sql postgresql

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

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

schemas 行上的每个 unique_id 都有一个包含相似列的表,例如:users (id, data), 假期(id,数据)等。

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

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,通常是不可能的。但是,对于您指定的用例,可以使用 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;

关于sql - 从表中存储表名的表中查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28454103/

相关文章:

mysql - 当我的列数据类型为 SET 时,我需要使用什么类型的 SQL 查询?

django - 使用PostgreSQL将Django应用程序部署到Kubernetes Google Cloud集群

sql - 查询优化不适合左外连接

sql - 在给定特定条件 SQL 的情况下,仅对不同的值求和

sql - 在 sqlite 中使用 guid 选择 guid 作为二进制文件存储在 sqlite 数据库中的位置

postgresql - 你如何在 PostgreSQL 中创建虚拟表?

postgresql - 无法打开 SELECT 查询作为游标

postgresql - 如何更新事件触发器?

postgresql - 使用两个条件更新一列

sql - MYSQL - IN 和 EXIST 之间的区别