从单个postgresql查询中以k开头的所有表中获取计数

时间:2011-11-17 14:53:36

标签: sql postgresql aggregate-functions

我想知道有多少行 我的postgresql数据库中的所有表都以表名中的“ke”开头。 我可以很容易地得到所有以ke开头的表的列表:

SELECT c.relname AS tablename FROM pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
WHERE c.relkind IN ('r','') 
AND n.nspname NOT IN ('pg_catalog', 'pg_toast','information_schema') 
AND c.relname LIKE 'ke%'

我希望能做的是这样的事情

SELECT c.relname AS tablename FROM pg_class c
,(select count(*) from c.relname) as    total
LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
WHERE c.relkind IN ('r','') 
AND n.nspname NOT IN ('pg_catalog', 'pg_toast','information_schema') 
AND c.relname LIKE 'ke%'

但我得到错误架构“c”不存在。 我并不感到惊讶,但我想将列结果视为表名。

我该怎么做?

我读到我可以使用EXECUTE,但我不认为我可以使用该命令? 我真的很想帮助解决这个问题。提前谢谢。

2 个答案:

答案 0 :(得分:1)

对于像这样的临时代码,匿名代码块是一个很好的工具。会话结束时或者在其上发出删除表时,将删除代码块中的临时表。这在> = 9.0。

中可用
DO $$
DECLARE r record;
BEGIN
    DROP TABLE IF EXISTS temp_counts;
    CREATE TEMPORARY TABLE temp_counts (table_name NAME, count BIGINT);  

     FOR r IN SELECT c.relname AS tablename 
              FROM pg_class c
              LEFT JOIN pg_catalog.pg_namespace n 
                    ON (n.oid = c.relnamespace)
              WHERE c.relkind IN ('r','') 
                AND n.nspname NOT IN ('pg_catalog', 'pg_toast','information_schema') 
                AND c.relname LIKE 'ke%'
    LOOP
        EXECUTE 'INSERT INTO temp_counts (table_name,count) SELECT ''' || r.tablename || ''', counts FROM (SELECT count(*) as counts FROM ' || r.tablename || ' ) AS counter';
    END LOOP;

END$$;

select *
from temp_counts;

答案 1 :(得分:0)

是的,你必须创建一个plpgsql函数来执行动态sql。

CREATE OR REPLACE FUNCTION countrows(t varchar) RETURNS bigint 
LANGUAGE plpgsql AS $$
 DECLARE
  rv bigint;
 BEGIN
  EXECUTE 'SELECT count(*) FROM '||t INTO rv;
  RETURN rv;
 END;
$$;

然后你在某个地方使用SELECT countrows('mytable');之类的东西(可能只是countrows('mytable'),你不需要进行子选择)。