SQL查询,如何添加计数(*)列
我有一个疑问:SQL查询,如何添加计数(*)列,sql,oracle,count,subquery,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 ---------------- ------
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上找到代码,下次最好搜索。谢谢
抱歉,这里是指向解决方案的链接:
下面是代码:
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
尝试:
您可以在查询结束时检索@@ROW\u COUNT不清楚要计数什么。但如果要计算返回的行数,请使用分析函数:
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;
为列提供表数,而不是每个表中的记录数
你在混合两种不同的概念。数据和元数据
您的查询是查询数据字典,以获取有关数据库中作为对象的表的一些信息。这是元数据:关于数据的数据
而每个表包含多少行的计数只是数据
你有两个选择。第一种方法是将DBA_表视图连接到查询和se中;ect NUM_行。如果你的统计数据相当新鲜,你只需要一个指示性的数字,这可能就足够了
如果您不在这些表上使用统计信息,或者希望获得高度准确的计数,则需要使用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;
注意,我添加了一个关于段类型的测试。如果表已分区,或者希望在查询中包含索引段,则需要修改函数的逻辑
请注意,如果您的表很大,则计数可能需要很长时间,并显著降低查询速度。速度是使用USER_TABLES.NUM_ROWS提供的近似值的另一个优势。您使用的是什么RDBMS???@MahmoudGamal:由于查询中的
dba_段
,我猜它是Oracle。您想计算多少?如果您找到了解决方案,那么至少要体面地链接到它并将此问题标记为已回答(或作为副本关闭)很抱歉,这不起作用,给出的列有表的数量,而不是每个表中的记录的数量。虽然这是SQL Server的问题,但在Oracle中您不能这样做…那么,M$@@ROW\u COUNT的Oracle对应项是什么?@@ROW\u COUNT相当于Oracle的SQL%ROWCOUNT。我的MSSQL有点生疏,但我认为您不能在Oracle中使用@ROW\u COUNT按照您建议的方式进行查询。当然,SQL%ROWCOUNT只返回受上一个DML语句影响的行数(即更新、删除的行数)。
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;