sql - 如何将表中的数据添加到 PostgreSQL 中的最大对象查询

标签 sql postgresql

Postgres 9.1+ 数据库包含每个名为 firma 和公司编号的公司的不同架构,例如 firma1、firma5、firma99、firma12

每个模式都包含一个带有公司名称的表:

-- this table contains always exactly one row:
create table firma5.company ( company char(50) not null );

以下查询列出了最大的对象:

select
(n.nspname||'.'||relname)::char(45) as tablename
    , pg_size_pretty(pg_total_relation_size(c.oid))::char(10) as totalsize
    , case
        when c.relkind='i' then 'index'
        when c.relkind='t' then 'toast'
        when c.relkind='r' then 'table'
        when c.relkind='v' then 'view'
        when c.relkind='c' then 'composite type'
        when c.relkind='S' then 'sequence'
        else c.relkind::text
      end ::char(14) as "type"
from
    pg_class c
    left join pg_namespace n on n.oid = c.relnamespace
    left join pg_tablespace t on t.oid = c.reltablespace
where
    (pg_total_relation_size(c.oid)>>20)>0 and c.relkind!='t'
order by
    pg_total_relation_size(c.oid) desc

此查询显示公司架构,如 firma1、firma5 等。

如何在此查询结果中也显示公司名称 ( firman.company.company )?查询也可能从 firmaN 以外的模式返回表。在这种情况下,公司名称列应为空或 null。

最佳答案

这对于普通 SQL 是不可能的,因为您无法预先指定要连接的表名,因此您需要运行动态查询。但是,如果模式具有公司表,您可以创建一个简单的函数,从动态查询中返回公司名称:

CREATE FUNCTION company_name (sch text) RETURNS text AS $$
DECLARE
  comp text := NULL;
BEGIN
  IF strpos(sch, 'firma') = 1 THEN
    EXECUTE 'SELECT company FROM ' || sch || '.company' INTO comp;
  END IF;
  RETURN comp;
END; $$ LANGUAGE plpgsql STRICT STABLE;

然后在您的查询中使用该函数:

select
      (n.nspname||'.'||c.relname)::char(45) as tablename
    , pg_size_pretty(pg_total_relation_size(c.oid))::char(10) as totalsize
    , case
        when c.relkind='i' then 'index'
    --    when c.relkind='t' then 'toast' FILTERED OUT IN WHERE CLAUSE
        when c.relkind='r' then 'table'
        when c.relkind='v' then 'view'
        when c.relkind='c' then 'composite type'
        when c.relkind='S' then 'sequence'
        else c.relkind::text
      end ::char(14) as "type"
    , company_name(n.nspname) as company  -- <<<<<<<<<<<<<<<<<<<<<<<
from pg_class c
left join pg_namespace n on n.oid = c.relnamespace
--left join pg_tablespace t on t.oid = c.reltablespace NOT USED
where (pg_total_relation_size(c.oid)>>20)>0 and c.relkind!='t'
order by pg_total_relation_size(c.oid) desc;

关于sql - 如何将表中的数据添加到 PostgreSQL 中的最大对象查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31097997/

相关文章:

Mysql使用准备好的语句选择和插入

sql - 两个 CTE 的内部连接需要很长时间

sql - 如何在 postgres 触发器中使用 "IF statements"

c# - PostgreSQL:命令已经在进行中

java - 如何在 Digital Ocean 上的同一个 Droplet 中使用 postgresql 和 spring boot 应用程序

sql - 使用 Netezza SQL 将星期几提取为整数

sql - cfquery 文本编码问题

sql - 取一个带有数量字段或项目计数的表,并动态地为每个字段创建唯一的行

postgresql - 如何在 Postgres 扩展上运行覆盖率报告

sql-server-2008 - postgresql中如何编写索引查询