我有一个名为 folder 的表,该表在相同的Postgres中存储具有相同结构的其他表的名称(名为 fileXXX ,其中X是一个数字)。数据库。
我想建立一个SQL语句,该数据库从 folder 表中检索数据库中所有 fileXXX 表的名称,并创建具有此结构的单个SQL语句
SELECT * FROM _file001_
UNION
SELECT * FROM _file002_
UNION
SELECT * FROM _file003_
...
我已经找到了很多有关如何在WHERE子句中使用SELECT语句的示例,但是没有一个通过这种方式在FROM子句中使用SELECT语句的示例。
答案 0 :(得分:2)
可以为此(see here)编写函数
从信息模式中查询所有表名:
SELECT table_name
FROM information_schema.tables
WHERE table_name LIKE 'file%'
将包含表名而不是SELECT table_name
写入查询字符串
SELECT
'SELECT * FROM ' || table_name
...
将每个结果行与string_agg
分组,使用UNION ALL
作为分隔符:
SELECT
string_agg(/*see (2)*/, ' UNION ALL ')
...
这将导致您在问题中提到的查询。
最后一个字符串可以解释为真实查询,并且可以在此函数中执行:
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;
调用此函数:
SELECT * FROM union_all()