提取每个 table 中的记录数
Extracting number of records in each table
我想编写一个查询来检索特定所有者下存在的每个表中的行。我不太擅长编写查询,所以我无法在互联网上找到解决方案。我正在写的查询是:
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
请帮助我写出相同的确切查询。谢谢!
当您使用分组函数(计数)时,您必须将所有出现在 SELECT 而不是出现在分组函数中的列放在 GROUP BY 部分
SELECT TABLE_NAME, COUNT(*)
FROM DBA_TABLES
WHERE OWNER='ABC'
GROUP BY TABLE_NAME;
但是这个查询 return 不会让您感兴趣。它不是行数。它是该架构中的表数。
Extracting number of records in each table
那你查询DBA_TABLES的方向就完全错了。它将为您提供用户拥有的 table 的计数,但不是每个 table.
中的行数
三种方式:
- 在纯 SQL 中,table 名称必须是静态的。也就是说,您必须明确列出 table 个名称并获取计数。
SELECT COUNT(*) FROM table_1;
SELECT COUNT(*) FROM table_2;
SELECT COUNT(*) FROM table_3;
...
and so on...
使用好的文本编辑器,您可以快速完成。
- 如果收集的统计数据是最新的,那么您可以依赖 NUM_ROWS in DBA_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 中,遍历所有 table 名称,创建动态 sql 并使用 EXECUTE IMMEDIATE 执行 (ab)。
获取所有 table 的行数,可以使用一点 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;
这会为每个 table 生成一个 select count(*) from ..
,然后 "runs" 通过 dbms_xmlgen
并解析生成的 XML 输出以获取实际数字。
我想编写一个查询来检索特定所有者下存在的每个表中的行。我不太擅长编写查询,所以我无法在互联网上找到解决方案。我正在写的查询是:
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
请帮助我写出相同的确切查询。谢谢!
当您使用分组函数(计数)时,您必须将所有出现在 SELECT 而不是出现在分组函数中的列放在 GROUP BY 部分
SELECT TABLE_NAME, COUNT(*)
FROM DBA_TABLES
WHERE OWNER='ABC'
GROUP BY TABLE_NAME;
但是这个查询 return 不会让您感兴趣。它不是行数。它是该架构中的表数。
Extracting number of records in each table
那你查询DBA_TABLES的方向就完全错了。它将为您提供用户拥有的 table 的计数,但不是每个 table.
中的行数三种方式:
- 在纯 SQL 中,table 名称必须是静态的。也就是说,您必须明确列出 table 个名称并获取计数。
SELECT COUNT(*) FROM table_1; SELECT COUNT(*) FROM table_2; SELECT COUNT(*) FROM table_3; ... and so on...
使用好的文本编辑器,您可以快速完成。
- 如果收集的统计数据是最新的,那么您可以依赖 NUM_ROWS in DBA_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 中,遍历所有 table 名称,创建动态 sql 并使用 EXECUTE IMMEDIATE 执行 (ab)。
获取所有 table 的行数,可以使用一点 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;
这会为每个 table 生成一个 select count(*) from ..
,然后 "runs" 通过 dbms_xmlgen
并解析生成的 XML 输出以获取实际数字。