SQL查询,如何添加count(*)列

时间:2013-04-16 12:52:13

标签: sql oracle count subquery

我有这个问题:

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

如何添加count(*)列?

我猜一个相关的子查询会做,但究竟是怎么做的?

谢谢!

抱歉发现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 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

您可以在查询结尾处检索@@ ROW_COUNT

答案 2 :(得分: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;

答案 3 :(得分: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提供的近似值的另一个优点。