Oracle SQL查询列出所有活动用户/模式并提供对象计数

时间:2016-11-15 23:53:06

标签: sql oracle join subquery inline

我正在尝试编写一个查询,它将为我提供有关用户/架构的信息。

需要使用以下内容:

COLUMNS = username,default_tablespace,account_status TABLE = dba_users

PLUS,结果集中的新虚拟列,显示该用户名/模式的对象计数。即它拥有的对象数量。 简单的where子句应该是account_status是打开的,并且用户名不是X,Y,Z之一。

所以它将以某种方式结合以下基本查询:

select username, default_tablespace, account_status
from dba_users
where account_status = 'OPEN'
and username not in ('GEORGE','ANNA','BOB')

有了这个:

select owner, count(*) as object_count from dba_objects
group by owner
order by 1

我试图使用在线查询。我能想到的最好的是下面的查询,但这只列出了dba_objects表中存在的用户。即ONLY,列出模式(包含至少1个对象)而不是普通用户。

select username, account_status, default_tablespace, subquery1.object_count 
from dba_users,
(
select owner,count(*) as object_count from dba_objects
group by owner order by 1
) subquery1
where username = owner
and account_status = 'OPEN'
and username not in ('GEORGE','ANNA','BOB')
order by username

我认为我需要执行左外连接,以保留来自完成查询其余部分的dba_users的记录,因此只返回" NULL"在object_count列中,但是当我尝试如下所示时,我得到垃圾结果,它列出的方式太多,重复用户多次随机对象计数。

select username, account_status, default_tablespace, subquery1.object_count 
from dba_users,
(
select owner, count(*) as object_count from dba_objects
group by owner order by 1
) subquery1
left join dba_users on username = subquery1.owner
and account_status = 'OPEN'
and username not in ('GEORGE','ANNA','BOB')
order by username

作为奖励,如果某人能够提出不仅提供上述内容的查询,而且使用额外的虚拟列来提供所使用的表空间大小,那就太棒了。所以它会使用类似下面的查询:

选择round((sum(bytes)/ 1024/1024 / 1024),1)as size_in_gb,owner    来自dba_segments    通过...分组    所有者

非常感谢。

1 个答案:

答案 0 :(得分:-1)

构建此类查询的方法有很多种。如果你只从另一个表中获得一个值,我会想要进行内联选择而不是费心去做一个明确的连接

select username, default_tablespace, account_status,
       (select count(1)
          from dba_objects o
         where o.owner = u.username) cnt_objects_owned,
       (select sum(bytes)
          from dba_segments s
         where s.owner = u.username) total_size_of_segments
  from dba_users u
 where account_status = 'OPEN'
   and username not in ('GEORGE','ANNA','BOB')

这样做的好处是可以相对轻松地添加新的内联选择。但是,如果将来您希望从dba_objectsdba_segments获得一些值,并且最终会在其他内联选择中重复自己,那么效率会非常低效。

有趣的是,如果我将查询中的count(1)更改为count(*)

,我会不断收到错误