PostgreSQL:使用动态名称的多个表的并集
我在模式中有一组表(大约100个),名为PostgreSQL:使用动态名称的多个表的并集,sql,postgresql,information-schema,Sql,Postgresql,Information Schema,我在模式中有一组表(大约100个),名为qgep,它们的名称以vl\ucode>开头。 它们有所有相同的列(colA、colB、colC) 我想做的是得到一个大表,它是我所有vl.*表的并集,还有一列是原始表的名称。 我可以得到表的列表: SELECT table_name FROM information_schema.tables WHERE table_schema = 'qgep' AND table_name LIKE 'vl_%' 我发现解决问题的唯一方法是生成SQ
qgep
,它们的名称以vl\ucode>开头。
它们有所有相同的列(colA、colB、colC)
我想做的是得到一个大表,它是我所有vl.*
表的并集,还有一列是原始表的名称。
我可以得到表的列表:
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
。
你有什么建议吗?
我可以用和。。。联合所有人
继承能帮我吗?是否有可能知道在选择中记录来自哪个类?解决方案确实是使用继承,我最终在上找到了解决方案
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()
它们有所有相同的列(colA、colB、colC)。
向所有列添加一个列col_X
,所有列都具有不同的值,并将这些表合并到一个大表中。动态sql仅适用于execute(或shell脚本:)我在脚本中使用它。不管怎样,我希望找到一个更好的方法。也许可以学一点。为什么要一次查询100个表?每个表都列出了值列表(选择组合框)的可能选项,并且选项以多种语言列出。我想生成一张大桌子作为一个决策者。非常感谢您的帮助。我想避免使用execute。我终于找到了使用继承的解决方案。
SELECT p.relname, vl.*
FROM qgep.is_value_list_base vl, pg_class p
WHERE vl.tableoid = p.oid;