提取每个表中的记录数

时间:2015-10-12 07:07:08

标签: sql oracle ora-00937

我想编写一个查询,该查询检索特定所有者下的每个表中的行。我不是很擅长编写查询,因此我无法在互联网上找到解决方案。我写的查询是:

SELECT TABLE_NAME, COUNT(*) FROM DBA_TABLES WHERE TABLE_NAME IN 
(SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER='ABC');

我知道查询是完全错误的,但我刚刚给它知道我想要什么。我希望它有所帮助。我得到的错误是:

ORA-00937: not a single-group group function

请帮我写相同的确切查询。谢谢!

3 个答案:

答案 0 :(得分:2)

  

提取每个表中的记录数

然后在查询 DBA_TABLES 时,您的方向完全错误。它将为您提供用户拥有的表的计数,但不会为您提供每个表中的行数。

有三种方式:

  • 在纯SQL中,表名必须是静态的。即你必须明确列出表名并获得计数。
SELECT COUNT(*) FROM table_1;
SELECT COUNT(*) FROM table_2;
SELECT COUNT(*) FROM table_3;
...
and so on...

使用优秀的文本编辑器,您可以快速完成。

  • 如果统计信息是最新收集的,那么您可以依赖 DBA_TABLES 中的 NUM_ROWS 。无论如何,最好先使用 DBMS_STATS 收集统计信息。
SQL> SELECT table_name, num_rows FROM dba_tables WHERE owner='SCOTT';

TABLE_NAME   NUM_ROWS
---------- ----------
CLASS               0
SALGRADE            5
BONUS               0
DEPT                4
EMP                14
  • 在PL / SQL中,循环遍历所有表名,创建动态sql并使用 EXECUTE IMMEDIATE 执行(ab)。

答案 1 :(得分:0)

当您使用组功能(计数)时,您必须将所有列出现在SELECT而不是组功能的列放在GROUP BY部分

SELECT TABLE_NAME, COUNT(*) 
FROM DBA_TABLES 
WHERE  OWNER='ABC'
GROUP BY TABLE_NAME;

但是这个查询不会给你带来任何有趣的回复。它不是行数。它是该模式中的表数。

答案 2 :(得分:0)

获取所有表的行数,可以使用一点XML魔术来完成:

select owner, 
       table_name, 
       to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from "'||owner||'"."'||table_name||'"')),'/ROWSET/ROW/C')) as count
from dba_tables
where owner = 'ABC' 
  and iot_name is null; 

这为每个表生成select count(*) from ..,然后"运行"通过dbms_xmlgen并解析生成的XML输出以获取实际数字。

dbms_xmlgen documentation