我有这个问题:
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
答案 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提供的近似值的另一个优点。