如何从名称从另一个表派生的表中选择值?

时间:2019-01-28 13:31:18

标签: sql postgresql

我有一个名为 folder 的表,该表在相同的Postgres中存储具有相同结构的其他表的名称(名为 fileXXX ,其中X是一个数字)。数据库。

我想建立一个SQL语句,该数据库从 folder 表中检索数据库中所有 fileXXX 表的名称,并创建具有此结构的单个SQL语句

SELECT * FROM _file001_
  UNION
  SELECT * FROM _file002_
  UNION
  SELECT * FROM _file003_
 ...

我已经找到了很多有关如何在WHERE子句中使用SELECT语句的示例,但是没有一个通过这种方式在FROM子句中使用SELECT语句的示例。

1 个答案:

答案 0 :(得分:2)

可以为此(see here)编写函数

demo:db<>fiddle

  1. 从信息模式中查询所有表名:

    SELECT table_name 
    FROM information_schema.tables 
    WHERE table_name LIKE 'file%'
    
  2. 将包含表名而不是SELECT table_name写入查询字符串

    SELECT 
        'SELECT * FROM ' || table_name
    ...
    
  3. 将每个结果行与string_agg分组,使用UNION ALL作为分隔符:

    SELECT
        string_agg(/*see (2)*/, ' UNION ALL ')
    ...
    
  4. 这将导致您在问题中提到的查询。

  5. 最后一个字符串可以解释为真实查询,并且可以在此函数中执行:

    CREATE OR REPLACE function union_all() returns table (ids int) AS $$ 
    declare
        _t text := '';
    begin 
        SELECT 
            string_agg('SELECT * FROM ' || table_name, ' UNION ALL ') 
                into _t 
        FROM information_schema.tables 
        WHERE table_name LIKE 'file%';
    
        return query execute _t;
    end;$$ language plpgsql;
    
  6. 调用此函数:

    SELECT * FROM union_all()