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;