【发布时间】:2021-02-14 14:50:07
【问题描述】:
我正在尝试检索一个结果集,该结果集返回消耗的总空间与每天和每周的总空间,仅按表的数据库模式细分,不幸的是我返回错误
请告知是否可以使用以下查询实现这一目标?
查询
SELECT
(SELECT MIN(CREATION_TIME) FROM V$DATAFILE) "CREATE_TIME",
(SELECT DISTINCT OWNER FROM DBA_SEGMENTS WHERE SEGMENT_TYPE='TABLE' ) "SCHEMAS",
(SELECT NAME FROM V$DATABASE) "DATABASE NAME",
ROUND((SUM(USED.BYTES) / 1024 / 1024/ 1024/ 1024 ),2) || 'TB' "DATABASE_SIZE",
ROUND((SUM(USED.BYTES) / 1024 / 1024/ 1024/ 1024 ) - ROUND(FREE.P / 1024 / 1024/ 1024/ 1024 ),2) || 'TB' "USED_SPACE",
ROUND(((SUM(USED.BYTES) / 1024 / 1024/ 1024/ 1024 ) - (FREE.P / 1024 / 1024/ 1024/ 1024 )) / ROUND(SUM(USED.BYTES) / 1024 / 1024/ 1024/ 1024 ,2)*100,2) || '%TB' "USED_IN%",
ROUND((FREE.P / 1024 / 1024/ 1024/ 1024 ),2) || 'TB' "FREE_SPACE",
ROUND(((SUM(USED.BYTES) / 1024 / 1024/ 1024/ 1024 ) - ((SUM(USED.BYTES) / 1024 / 1024/ 1024/ 1024 ) - ROUND(FREE.P / 1024 / 1024/ 1024/ 1024 )))/ROUND(SUM(USED.BYTES) / 1024 / 1024/ 1024/ 1024 ,2 )*100,2) || '%TB' "FREE_IN %",
ROUND(((SUM(USED.BYTES) / 1024 / 1024/1024 ) - (FREE.P / 1024 / 1024/1024 ))/(SELECT SYSDATE-MIN(CREATION_TIME) FROM V$DATAFILE),2) || 'GB' "GROWTH_DAY",
ROUND(((SUM(USED.BYTES) / 1024 / 1024/1024 ) - (FREE.P / 1024 / 1024/1024 ))/(SELECT SYSDATE-MIN(CREATION_TIME) FROM V$DATAFILE)/ROUND((SUM(USED.BYTES) / 1024 / 1024/1024 ),2)*100,3) || '%GB' "GROWTH_DAY_IN%",
ROUND(((SUM(USED.BYTES) / 1024 / 1024/1024 ) - (FREE.P / 1024 / 1024/1024 ))/(SELECT SYSDATE-MIN(CREATION_TIME) FROM V$DATAFILE)*7,2) || 'GB' "GROWTH WEEK",
ROUND((((SUM(USED.BYTES) / 1024 / 1024/1024 ) - (FREE.P / 1024 / 1024/1024 ))/(SELECT SYSDATE-MIN(CREATION_TIME) FROM V$DATAFILE)/ROUND((SUM(USED.BYTES) / 1024 / 1024/1024 ),2)*100)*7,3) || '%GB' "GROWTH WEEK IN %"
FROM (
SELECT BYTES FROM V$DATAFILE
UNION ALL
SELECT BYTES FROM V$TEMPFILE
UNION ALL
SELECT BYTES FROM V$LOG
) USED
CROSS JOIN
(SELECT SUM(BYTES) AS P FROM DBA_FREE_SPACE) FREE
GROUP BY FREE.P;
错误
ORA-01427: single-row subquery returns more than one row
01427. 00000 - "single-row subquery returns more than one row"
*Cause:
*Action:
您能否建议使用 DBA_SEGMENTS 表或 DBA_OBJECTS 是否是好的选择?
【问题讨论】:
-
为什么不使用普通连接,而不是使用这些子查询?子查询与外部查询不相关,因此可以返回任意数量的行。并且不推荐使用
,而不是CROSS JOIN -
@Charlieface - 您可以编辑查询以进行交叉连接吗?
-
@Charlieface - 同样的错误
-
我从来没有说过会修复它,那只是老式的交叉连接语法。您的问题是子查询
SCHEMAS和DATABASE(以及SYSDATE-MIN(CREATION_TIME)一个)返回多个结果。我无法解决这个问题,因为我不知道您希望如何将内部表与外部表关联起来。我之前的评论是,如果您使用常规连接,它将迫使您考虑如何匹配行
标签: sql oracle plsql database-administration