-3

我有这个查询:

select segment_name,owner,blocks*8192/1024/1024 as MB,tablespace_name
from dba_segments
where segment_name like 'AUD_2%' and owner like 'AUDITOR'
order by 1 desc;

SEGMENT_NAME     OWNER              MB TABLESPACE_NAME
---------------- ---------- ---------- ----------------
AUD_201304       AUDITOR             7 WSS     
AUD_201303       AUDITOR            12 WSS     
AUD_201302       AUDITOR            11 WSS

如何添加计数(*)列?

我猜一个相关的子查询会做,但究竟如何?

谢谢 !

抱歉在stackoverflow上找到了代码,下次应该更好地搜索。谢谢

抱歉,这里是解决方案的链接: How to count(*) of multiple tables, size and tablespace in one query

这里是代码:

SELECT ut.table_name,
           to_number(extractvalue(xmltype (dbms_xmlgen.getxml ('select count(*) c from '         ||ut.table_name)),'/ROWSET/ROW/C')) row_count,
       db.blocks*8192/1024/1024 as MB,
       db.tablespace_name
FROM user_tables ut
  join dba_segments db on db.segment_name = ut.table_name
WHERE ut.table_name LIKE 'AUD_2%' and owner like 'AUDITOR'
ORDER BY ut.table_name DESC;

这里是输出:

TABLE_NAME                      ROW_COUNT         MB TABLES
------------------------------ ---------- ---------- ------
AUD_201304                          21067          7 WSS
AUD_201303                          43198         12 WSS
AUD_201302                          39046         11 WSS
AUD_201301                          44523         17 WSS
AUD_201212                          50580         15 WSS
AUD_201211                          49589         14 WSS
4

4 回答 4

2

尝试:

select 
        segment_name,
        owner,
        blocks*8192/1024/1024 as MB,
        tablespace_name,
        (select num_rows from dba_tables where table_name=segment_name) TOTAL_ROWS
from dba_segments
where segment_name like 'AUD_2%' and owner like 'AUDITOR'
order by 1 desc;
于 2013-04-16T12:54:06.457 回答
0

“给出表数的列,而不是每个表中的记录数”

你正在混合两个不同的概念。数据和元数据。

您的查询是查询数据字典以获取有关您的表的一些信息作为数据库中的对象。这是元数据:关于数据的数据。

而每个表包含多少行的计数只是数据。

你有两个选择。第一个是将 DBA_TABLES 视图加入您的查询并选择 NUM_ROWS。如果您的统计数据相当新鲜,并且您只需要一个指示性数字,这可能就足够了。

如果您不使用这些表的统计信息,或者您想要高度准确的计数,您将需要使用 PL/SQL。

create or replace function tab_row_cnt ( tname in user_tables.table_Nmae%type)
return pls_integer
is
  n pls_integer;
begin
  execute immediate 'select count(*) from '||tname into n;
  return n;
end;

您可以将此函数包含在查询的投影中。

select segment_name,owner,blocks*8192/1024/1024 as MB,tablespace_name
       , tab_row_cnt (segment_name) as row_count
from dba_segments
where segment_name like 'AUD_2%' and owner like 'AUDITOR'
and segment_type = 'TABLE'
order by 1 desc;

请注意,我在 SEGMENT_TYPE 上添加了一个测试。如果您的表是分区的,或者如果您想在查询中包含索引段,您将需要修改函数的逻辑。

请注意,如果您的表很大,计数可能需要很长时间,并且会大大减慢您的查询速度。速度是使用 USER_TABLES.NUM_ROWS 提供的近似值的另一个优势。

于 2013-04-16T13:15:40.837 回答
0

您可以在查询结束时检索 @@ROW_COUNT

于 2013-04-16T12:57:14.013 回答
0

目前尚不清楚您要计算什么。但是如果要计算返回的行数,请使用分析函数:

select segment_name, owner, blocks*8192/1024/1024 as MB, tablespace_name,
       count(*) over () as cnt
from dba_segments
where segment_name like 'AUD_2%' and owner like 'AUDITOR'
order by 1 desc;
于 2013-04-16T13:14:16.450 回答