FROM DUAL UNION ALL 是 Oracle 特有的写法,专门用来在 SQL 中手工构造一个固定的多行数据集(即“行值构造函数”)。

Oracle的FROM DUAL UNION ALL用于手工构造固定多行数据集,借虚拟表DUAL和UNION ALL实现。


在永洪报表中,它确保维度标签即使无数据也完整显示(配合LEFT JOIN,无数据时金额为NULL),避免报表空白。此写法为Oracle专属,其他数据库需调整写法。

行值构造函数:FROM DUAL UNION ALL

sql 复制代码
WITH dims AS (
    SELECT 1 AS sort_id, '全部融资租赁资产' AS 分组1, '全部融资租赁资产' AS 行标签, 'all' AS cat_code FROM DUAL UNION ALL
    SELECT 2, '按租赁物所属类别分类', '设备类', 'device' FROM DUAL UNION ALL
    SELECT 3, '按租赁物所属类别分类', '  其中,道路运输设备', 'road' FROM DUAL UNION ALL
    SELECT 4, '按租赁物所属类别分类', '       其中,乘用车', 'car' FROM DUAL UNION ALL
    SELECT 5, '按租赁物所属类别分类', '          商用车', 'truck' FROM DUAL UNION ALL
    SELECT 6, '按租赁物所属类别分类', '          消防、救护等特种车辆', 'empty' FROM DUAL UNION ALL
    SELECT 7, '按租赁物所属类别分类', '          轨道交通车辆(含铁路运输设备)', 'empty' FROM DUAL UNION ALL
    SELECT 8, '按租赁物所属类别分类', '          摩托车、电动车辆、非机动车', 'empty' FROM DUAL UNION ALL
    SELECT 9, '按租赁物所属类别分类', '     水上交通运输设备(船舶海工设备)', 'empty' FROM DUAL UNION ALL
    SELECT 10, '按租赁物所属类别分类', '     航空运输设备(航空器及其配套设备)', 'air' FROM DUAL UNION ALL
    SELECT 11, '按租赁物所属类别分类', '     医疗设备', 'medical' FROM DUAL UNION ALL
    SELECT 12, '按租赁物所属类别分类', '     通用机械设备', 'general' FROM DUAL UNION ALL
    SELECT 13, '按租赁物所属类别分类', '     工程机械设备', 'engineering' FROM DUAL UNION ALL
    SELECT 14, '按租赁物所属类别分类', '     农林机械设备', 'agriculture' FROM DUAL UNION ALL
    SELECT 15, '按租赁物所属类别分类', '     工业装备', 'industry' FROM DUAL UNION ALL
    SELECT 16, '按租赁物所属类别分类', '基础设施及不动产', 'empty' FROM DUAL UNION ALL
    SELECT 17, '按租赁物所属类别分类', '  其中,房屋', 'empty' FROM DUAL UNION ALL
    SELECT 18, '按租赁物所属类别分类', '     构筑物', 'empty' FROM DUAL UNION ALL
    SELECT 19, '按租赁物所属类别分类', '       其中,道路', 'empty' FROM DUAL UNION ALL
    SELECT 20, '按租赁物所属类别分类', '          管道(市政管道、水利管道)', 'empty' FROM DUAL UNION ALL
    SELECT 21, '按租赁物所属类别分类', '          桥梁、隧道', 'empty' FROM DUAL UNION ALL
    SELECT 22, '按租赁物所属类别分类', '          坝、堰、水道、沟、洞', 'empty' FROM DUAL UNION ALL
    SELECT 23, '按租赁物所属类别分类', '          码头、台、站', 'empty' FROM DUAL UNION ALL
    SELECT 24, '按租赁物所属类别分类', '在建工程(设备类)', 'empty' FROM DUAL UNION ALL
    SELECT 25, '按租赁物所属类别分类', '在建工程(非设备类)', 'empty' FROM DUAL UNION ALL
    SELECT 26, '按租赁物所属类别分类', '无形资产', 'intangible' FROM DUAL UNION ALL
    SELECT 27, '按租赁物所属类别分类', '生物资产', 'biological' FROM DUAL UNION ALL
    SELECT 28, '按租赁物所属类别分类', '其他资产', 'empty' FROM DUAL
),

用不可见字符来保持缩进

FROM DUAL UNION ALLOracle 特有的写法,专门用来在 SQL 中手工构造一个固定的多行数据集(即"行值构造函数")。

拆开来看,它的含义和用法如下:

1. DUAL 是什么?

  • DUAL 是 Oracle 中一个系统自带的虚拟表,只有一行一列。

  • 它的作用就是让你在不需要查询任何真实表时,也能执行 SELECT 语句,比如计算 SELECT 1+2 FROM DUAL

2. UNION ALL 是什么?

  • UNION ALL 是集合操作符,用来把多个 SELECT 语句的查询结果纵向拼接在一起(保留所有行,不去重)。

3. 合在一起是什么意思?

SELECT ... FROM DUAL UNION ALL SELECT ... FROM DUAL 就相当于:

逐行生成一张固定的临时"维度表"

例如:

sql

复制代码
SELECT 1 AS sort_id, '正常' AS label FROM DUAL 
UNION ALL 
SELECT 2, '关注' FROM DUAL 
UNION ALL 
SELECT 3, '次级' FROM DUAL

实际返回的数据就是:

sort_id label
1 正常
2 关注
3 次级

为什么在永洪报表中大量使用这种写法?

您在之前的脚本中看到的 WITH dims AS (SELECT 1 ... FROM DUAL UNION ALL SELECT 2 ... ),其核心目的是:

固定报表的维度行(如五级分类:正常/关注/次级/可疑/损失/总计等),确保即使数据库中没有查询到任何数据,报表上依然能显示出这些行标签。

如果没有这种写法,当 base 表查询结果为 0 行时,整个 UNION ALL 结果会为空,报表就会一片空白。而使用 DUAL 构造的固定行,再配合 LEFT JOIN,即使无数据,金额列返回 NULL,行标签依然存在,满足您之前"维度列即使没有值也要完整显示"的需求。

注:这种写法是 Oracle 专属 的,因为 DUAL 是 Oracle 系统表。如果您在永洪上连接的是其他数据库(如 MySQL、SQL Server),需要用对应的写法(比如 SELECT 1 AS id UNION ALL SELECT 2,不加 FROM DUAL)。但鉴于您所有的表都是 jbfsbb.rp_*,且之前一直运行正常,说明您的数据源就是 Oracle,可以放心使用。

相关推荐
小刘在重生~4 小时前
Oracle_day2 单行函数|组函数|分组|伪列|子查询|分页|多表连接
笔记·oracle·面试
NineData7 小时前
NineData 与统信服务器操作系统完成兼容认证
数据库·oracle·操作系统·软件·数据库管理工具·ninedata·统信
山岚的运维笔记1 天前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
geovindu1 天前
sql: Transaction & Concurrency Patterns using Oracel 21c
oracle·数据库开发·数据库架构
jnrjian1 天前
DRG-50857 ORA-30576 drixmd.PurgeKGL CTXSYS
数据库·oracle
jnrjian1 天前
Domain index 解决中英文 联合查询
oracle
jnrjian1 天前
Domain sync job SCHEDULER 空白job
oracle
TLA技术1 天前
LogMiner vs 裸日志解析(三):Oracle日志解析中的“前镜像”和“后镜像”,到底怎么用?
数据库·oracle·flink·dba·迁移学习
点纭2 天前
C 语言 第七章 常用函数(3)
c语言·开发语言·算法·oracle·c#
oradh3 天前
Oracle Undo问题总结(ORA-600 [4xxx] 系列错误)
数据库·oracle