2015-10-12 46 views
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

请帮我写的一样准确的查询。谢谢!

+0

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

+0

“*我想要写以检索特定的所有者下的每个表中的行本查询*”所以你想从表中获取行或者你想要的只是元数据信息? –

回答

2

提取的记录数在每个表

那么你是完全错误的方向,而查询DBA_TABLES。它会给你一个用户拥有的表的数量,但不是每个表中的行数。

有三种方式:

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

使用一个很好的文本编辑器,你可以很快做到这一点。

  • 如果收集统计信息是最新的,那么你可以依靠NUM_ROWSDBA_TABLES。无论如何,最好先使用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,遍历所有表名,使用EXECUTE IMMEDIATE创建动态SQL和执行(AB)。
+0

使用第二种方法(NUM_ROWS)似乎没有工作。我在输出中再添加一个名为NUM_ROWS的列,但所有表中相同的字段为空。 – user3379410

+0

@ user3379410:那么你还没有收集你的表的任何统计数据。 –

+0

你的意思是这里没有数据? – user3379410

0

当您使用组功能(计数),你必须把它出现在SELECT,而不是在组函数GROUP BY部分

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

所有列,但该查询什么有趣返还给您。它不是行数。这是该架构中的表的数量。

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