sql - 在 Oracle SQL 选择查询中使用列引用来避免重新计算
问题描述
我想创建一个汇总的数据库备份报告,其中包括来自多个彼此无关的数据库表的数据。例如,我想在 v$database 视图中包含数据库的名称:
SQL> Select name from v$database;
以及数据库的大小:
SQL> SELECT sum(bytes) FROM v$datafile;
并考虑这两个视图之间没有共同的列。
除此之外,我想将数据库大小包含在字节、KB、MB ......等中。
我正在使用以下查询:
SQL> SELECT
"Database", "DB_SIZE_IN_Bytes", "DB_SIZE_IN_KBs", "DB_SIZE_IN_MBs",
"DB_SIZE_IN_GBs", "DB_SIZE_IN_TBs"
FROM (
SELECT
(SELECT name FROM v$database ) "Database",
(SELECT sum(bytes) FROM v$datafile ) "DB_SIZE_IN_Bytes",
(SELECT sum(bytes)/1024 FROM v$datafile ) "DB_SIZE_IN_KBs",
(SELECT sum(bytes)/1024/1024 FROM v$datafile ) "DB_SIZE_IN_MBs",
(SELECT sum(bytes)/1024/1024/1024 FROM v$datafile ) "DB_SIZE_IN_GBs",
(SELECT sum(bytes)/1024/1024/1024/1024 FROM v$datafile ) "DB_SIZE_IN_TBs"
FROM dual
);
通过这种方式,我避免了 v$database 和 v$datafile 之间的连接条件。
这只是一个示例,但是,在我的项目中,我有 10 多个表。他们中的大多数没有一个共同的列。
问题是在将字节转换为 kbs、mbs 等时,我想使用列引用,例如:
(SELECT DB_SIZE_IN_Bytes/1024 FROM dual ) "DB_SIZE_IN_KBs",
(SELECT DB_SIZE_IN_KBs /1024 FROM dual ) "DB_SIZE_IN_MBs",
(SELECT DB_SIZE_IN_MBs /1024 FROM dual ) "DB_SIZE_IN_GBs",
(SELECT DB_SIZE_IN_GBs /1024 FROM dual ) "DB_SIZE_IN_TBs"
而不是一次又一次的计算。有没有办法使用示例中提到的列引用而不是重新计算?
解决方案
使用子查询在from
子句中计算一次总和的结果,然后使用它:
SELECT (SELECT name FROM v$database ) as "Database",
DB_SIZE_IN_Bytes,
DB_SIZE_IN_Bytes / 1024 as DB_SIZE_IN_KBs,
DB_SIZE_IN_Bytes / (1024 * 1024) as DB_SIZE_IN_MBs,
DB_SIZE_IN_Bytes / (1024 * 1024 * 1024) as DB_SIZE_IN_GBs,
DB_SIZE_IN_Bytes / (1024 * 1024 * 1024 * 1024) as DB_SIZE_IN_TBs
FROM (SELECT sum(bytes) as DB_SIZE_IN_Bytes FROM v$datafile ) x;
您也可以使用横向连接来执行此操作,但对于这个特定示例来说,这绝对是矫枉过正:
SELECT (SELECT name FROM v$database ) as "Database",
bb.*, bk.*, bm.*, bg.*, bt.*
FROM (SELECT sum(bytes) as DB_SIZE_IN_Bytes FROM v$datafile
) bb CROSS JOIN LATERAL
(SELECT bb.DB_SIZE_IN_Bytes / 1024 as DB_SIZE_IN_Kb
FROM dual
) bk CROSS JOIN LATERAL
(SELECT bk.DB_SIZE_IN_Kb / 1024 as DB_SIZE_IN_Mb
FROM dual
) bm CROSS JOIN LATERAL
(SELECT bm.DB_SIZE_IN_Mb / 1024 as DB_SIZE_IN_Gb
FROM dual
) bg CROSS JOIN LATERAL
(SELECT bb.DB_SIZE_IN_Gb / 1024 as DB_SIZE_IN_Tb
FROM dual
) t;
推荐阅读
- c# - EntityFramework Core for MySql 映射数据库类型 指向我自己的类
- javascript - 用于获取页面输入的 onload javascript;然后将两个 css id 设置为 display:none' 和 "display:inline' 切换两个
拜托,我对javascript魔法很了解。我将不胜感激在页面加载时运行时的帮助,返回一个值或字符串以
- php - 使用 PHP MySQLi 准备语句的动态 SQL 连接
- python - 使用列列表过滤数据框,其中至少有一个列满足条件?
- google-apps-script - 基于单元格值脚本将行移动到另一个工作表
- java - 在 webview 中使用 findnext 时禁用平滑过渡
- javascript - 如何解构道具
- jquery - 如何获取使用 jquery 单击按钮的特定值
- django - 如何编写有问题的代码以避免出现错误?
- javascript - TopoJSON 中的未定义属性