如何修改Oracle SQL查询:隐藏行级NUM_VIEWS仅保留OWNER分组求和
实现Oracle SQL*Plus分组仅显示汇总行数值的方案
要实现你需要的输出效果,核心是利用SQL*Plus的格式化命令(BREAK、COMPUTE)来控制显示,同时调整查询语句去掉每行的冗余数值,具体步骤如下:
调整后的完整脚本
-- 设置分组规则:重复OWNER不显示,分组间空一行 BREAK ON OWNER DUPLICATES SKIP 1 -- 格式化各列显示宽度 COL OWNER FORMAT a8 COL GRANTEE FORMAT a10 COL TABLE_NAME FORMAT a26 COL PRIVILEGE FORMAT a12 -- 格式化NUM_VIEWS列,空值显示为空格 COL NUM_VIEWS FORMAT 999999 HEADING 'NUM_VIEWS' NULL '' -- 设置页面和行宽 SET PAGES 1000 LINES 180 -- 查询符合条件的记录,NUM_VIEWS列留空 SELECT OWNER, GRANTEE, TABLE_NAME, PRIVILEGE, NULL AS NUM_VIEWS FROM dba_tab_privs WHERE GRANTEE LIKE '%AAAAA%' AND (OWNER LIKE 'BBBBB%' OR OWNER='CCCCC') ORDER BY OWNER, GRANTEE, TABLE_NAME; -- 计算每个OWNER分组的记录总数,显示为sum COMPUTE COUNT LABEL 'sum' OF OWNER ON OWNER
关键说明
- 移除冗余分组计算:原查询中
GROUP BY四个字段后每条记录的count(*)都是1,属于冗余操作,直接查询原始记录即可。 BREAK命令控制分组展示:ON OWNER DUPLICATES让同一OWNER的重复值不显示,SKIP 1在不同OWNER分组间添加空行,匹配你期望的输出样式。COMPUTE命令生成汇总行:COUNT LABEL 'sum' OF OWNER ON OWNER会在每个OWNER分组结束后统计记录总数,显示为sum行,SQL*Plus会自动添加分隔线(********)。- 空值格式化控制:
COL NUM_VIEWS NULL ''让每行的NUM_VIEWS列显示为空格,仅保留汇总行的数值。
执行上述脚本后,输出会完全符合你的需求:每行不显示NUM_VIEWS的具体数值,仅在每个OWNER分组末尾显示该组的总数。
内容的提问来源于stack exchange,提问作者Jes Challand
相关产品推荐
相关产品推荐

