我正在尝试编写一个查询,它将为我提供有关用户/架构的信息。
需要使用以下内容:
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 通过...分组 所有者
非常感谢。
答案 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_objects
或dba_segments
获得一些值,并且最终会在其他内联选择中重复自己,那么效率会非常低效。
有趣的是,如果我将查询中的count(1)
更改为count(*)