1

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

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

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

4

3 回答 3

2

提取每个表中的记录数

那么在查询DBA_TABLES时,您完全走错了方向。它将为您提供用户拥有的表的计数,而不是每个表中的行数。

有以下三种方式:

  • 在纯 SQL 中,表名必须是静态的。即,您必须明确列出表名并获取计数。
从 table_1 中选择计数(*);
从 table_2 中选择计数(*);
从 table_3 中选择计数(*);
...
等等...

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

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

TABLE_NAME NUM_ROWS
---------- ----------
0 级
萨尔格莱德 5
奖金 0
4 部门
电磁脉冲 14
  • 在 PL/SQL 中,遍历所有表名,创建动态 sql 并使用EXECUTE IMMEDIATE执行(ab) 。
于 2015-10-12T07:18:33.273 回答
0

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

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

但是此查询不会返回您感兴趣的内容。它不是行数。它是该模式中的表数。

于 2015-10-12T07:10:17.783 回答
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 文档

于 2015-10-12T07:51:36.960 回答