【问题标题】:Oracle query returning error single-row subquery returns not executingoracle查询返回错误单行子查询返回未执行
【发布时间】: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 - 同样的错误
  • 我从来没有说过会修复它,那只是老式的交叉连接语法。您的问题是子查询SCHEMASDATABASE(以及SYSDATE-MIN(CREATION_TIME) 一个)返回多个结果。我无法解决这个问题,因为我不知道您希望如何将内部表与外部表关联起来。我之前的评论是,如果您使用常规连接,它将迫使您考虑如何匹配行

标签: sql oracle plsql database-administration


【解决方案1】:

至少,这是一个问题:

(SELECT DISTINCT OWNER FROM DBA_SEGMENTS WHERE SEGMENT_TYPE='TABLE' ) "SCHEMAS",

这可以返回多行。

您应该真正调试您的代码以找出问题所在。显然,带有SUM() 而没有GROUP BY 的子查询只返回一行,所以它们不是问题。

【讨论】:

  • 如果我过滤一个模式,它会返回,但如果我想返回所有模式,我会遇到上述错误,如何解决这个查询?
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2016-10-25
相关资源
最近更新 更多