sql - 如何从一个表中选择值,其名称来自另一个表?
问题描述
我有一个名为文件夹的表,它存储其他表的名称(名为fileXXX,其中 X 是一个数字),具有相同的结构,在同一个 Postgres DB 中。
我想建立一个 SQL 语句,从文件夹表中检索数据库中所有fileXXX表的名称,并创建一个具有这种结构的 SQL 语句
SELECT * FROM _file001_
UNION
SELECT * FROM _file002_
UNION
SELECT * FROM _file003_
...
我发现了很多关于如何在 WHERE 子句中使用 SELECT 语句的示例,但没有一个在 FROM 子句中以这种方式使用的示例。
解决方案
可以为此编写一个函数(请参见此处)
从信息模式中查询所有表名:
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()
推荐阅读
- ios - 如何从字符串中删除表情符号 - ios?
- android - 如何用 Dagger 注入 DialogFragment?
- ssis-2012 - 无效的 SQL 语句;预期 DELETE、INSERT、PROCEDURE、SELECT 或 UPDATE?
- javascript - 将 Cordova 版本 9.0.0 降级到 8.1.2 不起作用
- python - Py Spark No 这样的文件或目录问题
- c# - 无法将类型为“Newtonsoft.Json.Linq.JObject”的对象转换为类型“System.Collections.Generic.Dictionary`2[System.String,System.Object]”
- mysql - API 一次应该只返回 n 行
- flutter-layout - Flutter PageView 和 AudioPlayers
- mysql - 如何在 Docker 启动时自动选择 MySQL 数据库?
- grafana - Grafana - 使用 Prometheus(动态)属性/标签数据创建包含列值的表