一个查询来计算同一个表名但不同模式的所有记录

时间:2016-09-22 05:47:30

标签: sql amazon-redshift

我需要一个查询或脚本来生成以下内容:

select count(*) from events_abc;
select count(*) from events_def;
select count(*) from events_123;

理想情况下,我想做所有计数的总和,但如果我不能,那么所有计数的列表将是一个不错的开始。

我需要为Amazon Redshift执行此操作。问题是我有许多不同的模式,它们可以具有相同的表名。

因此架构john__foo可以有一个表名events_abc,架构mary__foo也可以有一个名为events_abc的表。

我会使用某种光标吗?编写脚本的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

来自Amazon RedShift Dev Guides - Examples of Catalog Queries

  

列出数据库中的模式和表

     

以下查询将STV_TBL_PERM连接到某些PG表以返回a   TICKIT数据库中的表列表及其架构名称(NSPNAME   柱)。该查询还返回每个中的总行数   表。 (当您的系统中有多个模式时,此查询很有用   具有相同的表名。)

select datname, nspname, relname, sum(rows) as rows
from pg_class, pg_namespace, pg_database, stv_tbl_perm
where pg_namespace.oid = relnamespace
and pg_class.oid = stv_tbl_perm.id
and pg_database.oid = stv_tbl_perm.db_id
and datname ='tickit'
group by datname, nspname, relname
order by datname, nspname, relname;

datname | nspname | relname  |  rows
--------+---------+----------+--------
tickit  | public  | category |     11
tickit  | public  | date     |    365
tickit  | public  | event    |   8798
tickit  | public  | listing  | 192497
tickit  | public  | sales    | 172456
tickit  | public  | users    |  49990
tickit  | public  | venue    |    202
(7 rows)

这或多或少是你想做的事,不是吗?

所以只需使用此查询。如果您已连接到正确的数据库,并希望在所有模式中列出所有以event_开头的表,则应执行以下操作:

SELECT datname, nspname, relname, SUM(rows) AS rows
FROM pg_class, pg_namespace, pg_database, stv_tbl_perm
WHERE pg_namespace.oid = relnamespace
  AND pg_class.oid = stv_tbl_perm.id
  AND pg_database.oid = stv_tbl_perm.db_id
  AND relname LIKE 'event_%'
GROUP BY datname, nspname, relname
ORDER BY datname, nspname, relname;