首页 > 解决方案 > 如何从一个表中选择值,其名称来自另一个表?

问题描述

我有一个名为文件夹的表,它存储其他表的名称(名为fileXXX,其中 X 是一个数字),具有相同的结构,在同一个 Postgres DB 中。

我想建立一个 SQL 语句,从文件夹表中检索数据库中所有fileXXX表的名称,并创建一个具有这种结构的 SQL 语句

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

我发现了很多关于如何在 WHERE 子句中使用 SELECT 语句的示例,但没有一个在 FROM 子句中以这种方式使用的示例。

标签: sqlpostgresql

解决方案


可以为此编写一个函数(请参见此处

演示:db<>小提琴

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

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

    SELECT 
        'SELECT * FROM ' || table_name
    ...
    
  3. 用 将每个结果行分组string_aggUNION 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()
    

推荐阅读