从多个表 Redshift SQL 获取行数?

问题描述 投票:0回答:4

我有一个正在使用新表进行更新的 redshift 数据库,因此我不能只手动列出我想要的表。我想从查询中获取所有表的行数。到目前为止我已经:

select 'SELECT ''' || table_name || ''' as table_name, count(*) As con ' ||
       'FROM ' || table_name || 
        CASE WHEN lead(table_name) OVER (order by table_name ) IS NOT NULL 
        THEN ' UNION ALL ' END
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '%results%'

但是当我这样做时,我收到错误:

Specified types or functions (one per INFO message) not supported on Redshift tables.

我进行了很多搜索,但似乎找不到解决我的问题的方法。任何帮助将不胜感激。谢谢!

编辑: 我改变了我的方法,并决定在 R 中使用 for 循环来获取每一行的行数,但我遇到了一个问题,即“row_counts”只保存一个数字,而不是像我一样保存每一行的计数想。这是代码:

schema <- "x"
table_prefix <- "results"
geos <- ad_districts %>% filter(geo != "geo")
row_count <- list()
i = 1

for (geo in geos){
  table_name <- paste0(schema, ".", table_prefix, geo)
  row_count[[i]] <- dbGetQuery(con, 
                             paste("SELECT COUNT(*) FROM", table_name))
  i = i + 1 
}
sql r count rows
4个回答
0
投票

您的查询正在对所有表执行 select * ,这将花费大量时间和资源。相反,使用系统表来获取相同的信息

select name, sum(rows) as rows
from stv_tbl_perm
where name like '%results%'
group by 1

0
投票

[编辑] - 我认为这是根本原因 - 某些 sql 函数仅在领导节点上受支持。尝试连接到该节点并重新运行 SQL。 https://docs.aws.amazon.com/redshift/latest/dg/c_sql-functions-leader-node.html

希望这有帮助。

select 'select count(*) as "' || table_schema || '.' || table_name || '" from ' || table_schema || '.' || table_name || ' ;' as sql_text
from information_schema.tables
;

[编辑 - 对此进行了一些改进以生成一系列可以立即运行的语句]

select rownum, case when rownum > 1 then sql_text else replace(sql_text, 'union all', '') end as sql_text
from
(
select rank() over (order by sql_text DESC) as rownum,
        sql_text
from
(
select 'select ''' || table_schema || ' ' || table_name || ''' , count(*) as "' || table_schema || '.' || table_name || '" from ' || table_schema || '.' || table_name || ' union all ' as sql_text
from information_schema.tables
where table_schema = 'public'
order by table_schema, table_name
)X
)Y 
order by rownum desc ;

0
投票
SELECT ' Select count(*) , '''+ tablename + '''  from   '+'"' + tablename +'"' +'  Union ALL  '
FROM pg_table_def
GROUP BY tablename

以上查询消除了任何带空格的表名。删除查询末尾的 UNION ALL,查询就可以执行了。


0
投票

出现此错误的原因是,Amazon Redshift 在处理元数据时不支持某些 PostgreSQL 函数或功能(例如 RANK())与某些查询类型结合使用。此外,Redshift 不支持直接使用某些功能来生成动态 SQL。

© www.soinside.com 2019 - 2024. All rights reserved.