PostgreSQL:使用动态名称联合多个表
PostgreSQL: union of several tables using dynamic names
我在名为 qgep
的模式中有一组 table(大约 100 个),名称以 vl_
开头。
它们具有所有相同的列(colA、colB、colC)。
我想做的是得到一个大的 table 这是我所有 vl_*
table 的联合,还有一列用原来的名字table.
我可以获得 table 的列表:
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'qgep'
AND table_name LIKE 'vl_%'
我发现解决问题的唯一方法是生成 SQL 命令以进一步执行它:
SELECT
string_agg(
'SELECT '''
||table_name
||''' AS table_name, colA, colB, colC FROM qgep.'
||table_name
, ' UNION ')::text
FROM information_schema.tables
WHERE table_schema = 'qgep'
AND table_name LIKE 'vl_%'"
然后执行这个SQL命令就会输出我想要的。虽然,它的性能很差,而且很丑...
我想避免使用 EXECUTE
。
你有什么建议吗?
我可以使用 WITH ... UNION ALL
做些什么吗?
继承对我有帮助吗?是否可以知道select
中的记录来自class?
create or replace function uall() returns table ( code integer ,
value character varying(50),
active boolean,tablename text ) AS $$
declare
_i int;
_r record;
_t text := '';
begin
select distinct string_agg($s$select *,'$s$||table_name||$s$' from $s$||table_name,' union all ') into _t from information_schema.tables where table_name like 'vl_%';
return query execute _t;
end;$$ language plpgsql
;
select * from uall()
解决方案确实是使用继承,我终于在Postgres doc上找到了解决方案。
SELECT p.relname, vl.*
FROM qgep.is_value_list_base vl, pg_class p
WHERE vl.tableoid = p.oid;
我在名为 qgep
的模式中有一组 table(大约 100 个),名称以 vl_
开头。
它们具有所有相同的列(colA、colB、colC)。
我想做的是得到一个大的 table 这是我所有 vl_*
table 的联合,还有一列用原来的名字table.
我可以获得 table 的列表:
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'qgep'
AND table_name LIKE 'vl_%'
我发现解决问题的唯一方法是生成 SQL 命令以进一步执行它:
SELECT
string_agg(
'SELECT '''
||table_name
||''' AS table_name, colA, colB, colC FROM qgep.'
||table_name
, ' UNION ')::text
FROM information_schema.tables
WHERE table_schema = 'qgep'
AND table_name LIKE 'vl_%'"
然后执行这个SQL命令就会输出我想要的。虽然,它的性能很差,而且很丑...
我想避免使用 EXECUTE
。
你有什么建议吗?
我可以使用 WITH ... UNION ALL
做些什么吗?
继承对我有帮助吗?是否可以知道select
中的记录来自class?
create or replace function uall() returns table ( code integer ,
value character varying(50),
active boolean,tablename text ) AS $$
declare
_i int;
_r record;
_t text := '';
begin
select distinct string_agg($s$select *,'$s$||table_name||$s$' from $s$||table_name,' union all ') into _t from information_schema.tables where table_name like 'vl_%';
return query execute _t;
end;$$ language plpgsql
;
select * from uall()
解决方案确实是使用继承,我终于在Postgres doc上找到了解决方案。
SELECT p.relname, vl.*
FROM qgep.is_value_list_base vl, pg_class p
WHERE vl.tableoid = p.oid;