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,可以放心使用。

相关推荐
cqsztech2 天前
Oracle ai database 26ai rac 通过gold image 更新季度补
数据库·人工智能·oracle
cqsztech2 天前
银河麒麟v11下 19c noncdb升级到 26ai
oracle
杨云龙UP2 天前
Oracle 19c RMAN历史备份清理失败:CONTROL_FILE_RECORD_KEEP_TIME 问题排查与整改实战
linux·运维·网络·数据库·oracle·rac
疯狂打码的少年2 天前
【数据库技术】SQL概述与数据定义(DDL:CREATE/DROP/ALTER)
数据库·笔记·sql·oracle
山峰哥3 天前
数据库工程与查询优化案例深度复盘‌
数据库·sql·oracle·编辑器·深度优先·宽度优先
circuitsosk3 天前
从零搭建行业知识平台:向量库+图数据库+传统关系库的多模检索统一层设计
数据库·python·oracle·向量数据库·rag·多模检索
严同学正在努力3 天前
Oracle Data Guard 容灾实战:从搭建到切换,一篇讲透
数据库·ai·oracle
oradh3 天前
Oracle CTAS+rename 表重建方法操作总结
数据库·oracle·ctas·oracle表重建方法
疯狂打码的少年3 天前
【数据库技术】关系代数连接运算(等值连接/自然连接/外连接)
jvm·数据库·笔记·oracle