Oracle Database 23ai 新特性: UPDATE 和 DELETE 语句的直接联接
Oracle Database 23c 引入了一系列令人振奋的新特性,其中一项尤为引人注目的是对 UPDATE 和 DELETE 语句支持直接联接(Direct Join)。这一新功能极大地简化了复杂数据操作的实现,提升了性能,并为数据库开发者提供了更强大的工具来管理数据。
一、背景
在传统的 SQL 操作中,当需要根据其他表中的数据更新或删除记录时,通常需要借助子查询或临时表来完成任务。这种方式不仅编写复杂,而且执行效率较低,尤其是在处理大规模数据集时。为了应对这些挑战,Oracle 在 23c 中引入了直接联接的支持,使得 UPDATE 和 DELETE 操作可以直接引用多个表的数据,从而实现了更加简洁高效的解决方案。
二、Direct Joins for UPDATE
2.1 准备示例表
drop table if exists t1 purge;
drop table if exists t2 purge;
drop table if exists t3 purge;create table t1 as
select level as id,'CODE' || level as code,'Description for ' || level as description
from dual
connect by level <= 100;alter table t1 add constraint t1_pk primary key (id);create table t2 as
select level as id,'CODE' || (level*10) as code,'Updated description for ' || (level*10) as description
from dual
connect by level <= 100;alter table t2 add constraint t2_pk primary key (id);create table t3 as
select level as id,'CODE' || (level*10) as code,'Updated description for ' || (level*10) as description
from dual
connect by level <= 100;alter table t3 add constraint t3_pk primary key (id);
2.2 传统方法解决需求
我们有这样的一个需求:现在我们使用 T2 表的联接来更新 T1 中的数据。我们希望通过 ID 值中的联接使用 T2.CODE 和 T2.DESCRIPTION 中的值来更新 T1.CODE 和 T1.DESCRIPTION 值。
首先我们检查前五行的数据。
column code format a10
column description format a30select * from t1 where id <= 5;ID CODE DESCRIPTION
---------- ---------- ------------------------------1 CODE1 Description for 12 CODE2 Description for 23 CODE3 Description for 34 CODE4 Description for 45 CODE5 Description for 5SQL>
按以往的经验,可以选择以下方案:
- 方案一:merge语句
merge into t1 a
using (select * from t2 b where b.id <= 5) b
on (a.id = b.id)
when matched thenupdate set a.code = b.code, a.description = b.description;
- 方案二:update+exists
update t1 aset (a.code, a.description) =(select b.code, b.description from t2 b where a.id = b.id)where exists (select 1from t2 bwhere a.id = b.idand b.id <= 5);
现在我们看到 T1.CODE 和 T1.DESCRIPTION 值已更新。
select * from t1 where id <= 5;ID CODE DESCRIPTION
---------- ---------- ------------------------------1 CODE10 Updated description for 102 CODE20 Updated description for 203 CODE30 Updated description for 304 CODE40 Updated description for 405 CODE50 Updated description for 50rollback;SQL>
2.3 23ai中的新特性
使用示例如下:
update t1 a
set a.code = b.code,a.description = b.description
from t2 b
where a.id = b.id
and b.id <= 5;
同样也可以完成数据更新
select * from t1 where id <= 5;ID CODE DESCRIPTION
---------- ---------- ------------------------------1 CODE10 Updated description for 102 CODE20 Updated description for 203 CODE30 Updated description for 304 CODE40 Updated description for 405 CODE50 Updated description for 50rollback;SQL>
2.4 ANSI 连接语法
我们不能在 T1 和 T2 之间使用 ANSI 连接语法,但如果有多个表驱动更新,则可以使用 ANSI 连接将它们连接在一起。下面的例子不推荐,但是它通过将T2连接到T3来证明了一点。
update t1 a
set a.code = b.code,a.description = b.description
from t2 b
join t3 c on b.id = c.id
where a.id = b.id
and b.id <= 5;rollback;
三、Direct Joins for DELETE
不仅更新可以直接连接,删除也可以。
首先我们检查前五行的数据。
column code format a10
column description format a30select * from t1 where id <= 5;ID CODE DESCRIPTION
---------- ---------- ------------------------------1 CODE1 Description for 12 CODE2 Description for 23 CODE3 Description for 34 CODE4 Description for 45 CODE5 Description for 5SQL>
我们根据 T2 的查询从 T1 中删除行。请注意,我们使用 ID 列在两个表之间进行联接,并使用一个或多个谓词来确定 T2 中的哪些行用于驱动删除。
delete t1 a
from t2 b
where a.id = b.id
and b.id <= 5;
我们可以看到行已被删除。
select * from t1 where id <= 5;no rows selectedSQL>
我们可以在 DELETE 关键字后面添加 FROM 关键字
delete from t1 a
from t2 b
where a.id = b.id
and b.id <= 5;rollback;
我们不能在 T1 和 T2 之间使用 ANSI 连接语法,但如果有多个表驱动删除,则可以使用 ANSI 连接将它们连接在一起。下面的例子不推荐,但是它通过将T2连接到T3来证明了一点。
delete t1 a
from t2 b
join t3 c on b.id = c.id
where a.id = b.id
and b.id <= 5;rollback;
四、优势分析
- 简化代码:新的语法结构更加简洁明了,减少了嵌套子查询的复杂度,提高了代码的可读性和维护性。
- 提升性能:直接联接操作能够更好地利用索引和优化器,减少不必要的扫描次数,从而显著提高查询性能。
- 增强灵活性:允许在一个语句中同时处理多个表的数据,满足更多复杂的业务逻辑需求。
- 降低错误率:避免了由于子查询或临时表引起的潜在问题,如数据不一致等。
五、总结
Oracle Database 23c 的 UPDATE 和 DELETE 语句直接联接新特性,代表了关系型数据库技术的一个重要进步。它不仅简化了开发者的日常工作,还为高效管理和优化大规模数据处理提供了强有力的支持。随着越来越多的企业采用这一新技术,我们有理由相信,这将大大促进数据库应用的发展和创新。
相关文章:
Oracle Database 23ai 新特性: UPDATE 和 DELETE 语句的直接联接
Oracle Database 23c 引入了一系列令人振奋的新特性,其中一项尤为引人注目的是对 UPDATE 和 DELETE 语句支持直接联接(Direct Join)。这一新功能极大地简化了复杂数据操作的实现,提升了性能,并为数据库开发者提供了更强…...

机器学习之随机森林算法实现和特征重要性排名可视化
随机森林算法实现和特征重要性排名可视化 目录 随机森林算法实现和特征重要性排名可视化1 随机森林算法1.1 概念1.2 主要特点1.3 优缺点1.4 步骤1.5 函数及参数1.5.1 函数导入1.5.2 参数 1.6 特征重要性排名 2 实际代码测试 1 随机森林算法 1.1 概念 是一种基于树模型的集成学…...

网络安全图谱以及溯源算法
本文提出了一种网络攻击溯源框架,以及一种网络安全知识图谱,该图由六个部分组成,G <H,V,A,E,L,S,R>。 1|11.知识图 网络知识图由六个部分组成,…...

单片机-外部中断
中断是指 CPU 在处理某一事件 A 时,发生了另一事件 B,请求 CPU 迅速去处理(中断发生);CPU 暂时停止当前的工作(中断响应), 转去处理事件 B(中断服务);待 CPU 将事件 B 处理完毕后,再回到原来事件 A 被中断的…...
《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》
《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》 一、MiniGPT-4:小模型撬动大视觉理解(一)项目概览(二)核心亮点(三)上手体验 二、ClipCap-Chinese:中文场景…...

onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制
文章目录 1. 页面跳转方式2. 你的场景分析3. 页面生命周期4. 总结5. 建议 在微信小程序中,页面跳转时, onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制。以下是详细说明: 1. 页面跳转方式 微信小程序提供了多种页面…...

Visio 画阀门 符号 : 电动阀的画法
本篇文章介绍阀门,很多朋友在利用Visio绘画管道流程简图时,需要进行阀门符号的绘画,而Visio提供的阀门符号种类并不是很齐全。 本篇文章给出电动阀的画法: 下图是液动阀的符号: 首先,找到“更多形状”中的…...

OOM排查思路
K8S 容器的云原生生态,改变了服务的交付方式,自愈能力和自动扩缩等功能简直不要太好用。 有好的地方咱要夸,不好的地方咱也要说,真正的业务是部署于容器内部,而容器之外,又有一逻辑层 Pod 。 对于容器和…...

《Spring Framework实战》10:4.1.4.2.详细的依赖和配置
欢迎观看《Spring Framework实战》视频教程 集合 <list/>、<set/>、<map/>和<props/>元素分别设置Java集合类型list、set、map和properties的属性和参数。以下示例显示了如何使用它们: <bean id"moreComplexObject" class&qu…...

网络安全-XSS跨站脚本攻击(基础篇)
漏洞扫描的原理 1.跨站脚本攻击介绍 xss跨站脚本攻击: xSS 全称(Cross site Scripting )跨站脚本攻击,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名,XSS是指攻…...

Git的学习和常见问题
文章目录 1.初始化配置2.新建仓库3.添加和提交文件4.git reset 回退版本5.git diff 查看差异6.git rm 删除文件7.文件 .gitigonre8.克隆远程仓库9.将已有的本地仓库关联到远程仓库10.分支的基本操作11.解决合并冲突配置问题 最近基于GeekHour的视频学习Git,记录了一…...

Flink源码解析之:Flink on k8s 客户端提交任务源码分析
Flink on k8s 客户端提交任务源码分析 当我们需要在代码中提交Flink job到kubernetes上时,需要如何做呢?要引入什么第三方依赖?需要提供什么内容?flink是如何将job提交到k8s上的?经过了什么样的流程,内部有…...
STLG_02_02_MS SQL - SSMS的安装和使用
SQL Server Management Studio (SSMS) 是 Microsoft 提供的一个集成环境,用于管理、开发和维护 SQL Server 数据库和 Analysis Services 数据库。 一、安装 SSMS 下载 SSMS: 访问 Microsoft 官方网站的 SSMS 下载页面。选择适合你操作系统的版本进行下载。SSMS 支持…...

git 常用命令和本地合并解决冲突
目录 一、常用命令 二、本地可视化合并分支解决冲突 一、常用命令 最近,使用mac电脑,无法直接使用小乌龟进行可视化操作,现在记录一些常用命令。 拉取: git clone <git url> 仅拉起某个单独分支: git clo…...

ThinkPHP 8高效构建Web应用-获取请求对象
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...

机器人技术:ModbusTCP转CCLINKIE网关应用
在当今自动化生产与智能制造领域,ModbusTCP转CC-LinkIE网关KJ-MTCPZ-CCIES的应用正日益成为提升生产效率、实现设备间高效通信的重要技术手段。这一转换技术不仅打破了不同通信协议间的壁垒,还为机器人产品的应用提供了更为广阔的舞台。ModbusTCP作为一种…...
C语言的语法
C语言的语法与应用探讨 C语言作为一种高效的程序设计语言,自1970年代问世以来,一直在科学计算、系统编程、嵌入式系统等领域中扮演着重要角色。本文将深入探讨C语言的基本语法、数据结构、控制结构以及其在实际应用中的重要性。 一、C语言基础 1.1 数…...
ElasticsearchJavaClient工具类分析
最近升级了Elasticsearch版本,从7.X升级到8.X的变化还是比较大的,原来7版本用的是RestHighLevelClient,8.X弃用RestHighLevelClient转而支持ElasticsearchClient,并且api调用方式经过建造者模式的改造,变成了链式调用。…...
Docker-文章目录
为什么互联网公司离不开Docker容器化,它到底解决了什么问题? VMware下Centos7安装步骤 Windows安装Docker Linux安装Docker Docker快速安装Tomcat 在docker中对MySQL快速部署与初始数据 利用Dockerfile构建自定义镜像 Dockerfile基础指令 Docker…...
docker安装codeserver 运行vite项目(linux)
估计很多人遇到了codeserver安装后执行vite项目 有proxy路径的问题 我这边去掉了路径代理直接端口访问 防火墙记得打开 8089 和 5173端口 code-server路径 服务器ip:8089 项目路径 服务器ip:5173 docker安装codeserver(linux) mkdir -p ~/.config dock…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...

Qt的学习(一)
1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...