代码之家  ›  专栏  ›  技术社区  ›  Kokizzu

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

  •  1
  • Kokizzu  · 技术社区  · 9 年前

    我有一张桌子叫 schemas ,它具有:

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

    每个 unique_id 模式 行具有具有类似列的表,例如: users (id,数据), holidays (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
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Ben Grimm    9 年前

    没有动态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;