Oracle数据库两表关联更新

news2024/11/27 9:45:28

先放结论

 UPDATE 需要更新的表名 B
    SET B.更新字段1 = '更新内容1', B.更新字段2 = '更新内容2'
  WHERE EXISTS (SELECT 1
           FROM 关联表名 A
          WHERE A.关联字段 = B.关联字段
            AND A.筛选字段1 = '筛选字段1' 
            AND A.筛选字段2 = '筛选字段2' 
            AND B.筛选字段3 = '筛选字段3' 
         );

问题分析

需要写一个更新语句,但是更新的判断条件是两个表关联查询出来的

踩坑一

一开始是打算UPDATE写两个表,然后WHERE里面两表关联,就像这样:

--错误sql
UPDATE 表名1 A,表名2 B
    SET A.更新字段1 = '更新内容1', A.更新字段2 = '更新内容2'
  WHERE A.关联字段 = B.关联字段
   		AND A.筛选字段1 = '筛选字段1' 
        AND A.筛选字段2 = '筛选字段2' 
        AND B.筛选字段3 = '筛选字段3' 

但是一直报错
很明显也不是缺失SET 关键字的问题
在这里插入图片描述

踩坑二

之后搜索怎么在Oracel关联两表更新。发现了下面这种写法

--正常sql
UPDATE 更新表名 A
   SET A.更新字段1 = '更新内容1'
 WHERE EXISTS (SELECT 1 FROM 关联表名 B WHERE A.关联字段 = B.关联字段)

但是也是没太仔细看,加上思维固化,写成了下面这种情况

--错误sql
UPDATE 更新表名 A
   SET A.更新字段1 = '更新内容1'
 WHERE EXISTS (SELECT 1
          FROM 更新表名 A, 关联表名 B
         WHERE A.关联字段 = B.关联字段
           AND A.筛选字段1 = '筛选字段1')

可以看到在FROM里面比搜索出来的sql语句,多了更新的表名A

显而易见,还会有点问题
但是这次并不是报错,而是筛选不是自己预想的筛选,导致更新的数据非常多

像下图一样,更新语句跑了1分半,更新了46万条数据。。。
明显是有问题的(实际上只需要更新几十条),被更新的B表实际上也只有26万条数据,不知道46万条更新怎么来的
只能先回滚更新
在这里插入图片描述
通过对比发现是FROM多写了个更新的表名,修改之后可以正常的更新,没有问题
在这里插入图片描述

踩坑三

既然已经可以两表关联查询,更新其中一个表了,那能不能同时更新两个表呢?

想当然的认为sql应该是这样的

UPDATE 更新表1 A
   SET A.更新字段1 = 'A表更新内容1' ,B.更新字段2 = 'B表更新内容2'
 WHERE EXISTS (SELECT 1
          FROM 更新表2 B
         WHERE A.关联字段 = B.关联字段
           AND A.筛选字段 = '筛选字段')

于是写出了下面的sql,但是事实证明这样写是不行的
在这里插入图片描述

语句分析

 UPDATE 需要更新的表名 B
    SET B.更新字段1 = '更新内容1', B.更新字段2 = '更新内容2'
  WHERE EXISTS (SELECT 1
           FROM 关联表名 A
          WHERE A.关联字段 = B.关联字段
            AND A.筛选字段1 = '筛选字段1' 
            AND A.筛选字段2 = '筛选字段2' 
            AND B.筛选字段3 = '筛选字段3' 
         );

A表和B表都有相同的关联字段,并且通过筛选字段校验。那么就有SELECT 1,那么EXISTS就会返回TRUE;最后进行更新操作。

EXISTS

EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False

EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT … FROM…), 我将其称为EXISTS的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。

此时在该更新sql中

--EXISTS的内查询语句为:
SELECT 1
 FROM 关联表名 A
WHERE A.关联字段 = B.关联字段
  AND A.筛选字段1 = '筛选字段1' 
  AND A.筛选字段2 = '筛选字段2' 
  AND B.筛选字段3 = '筛选字段3' 

--WHERE判断EXISTS返回的BOOL值来决定是否更新
WHERE EXISTS

SELECT 1

当我们只关心数据表有多少记录行而不需要知道具体的字段值时SELECT 1 FROM TABLE是一个很不错的SQL语句写法,它通常用于子查询。

SELECT 1 FROM TABLE可以减少系统开销,提高运行效率。因为此时数据库就不会去检索数据表里每条具体的记录和每条记录里每个具体的字段值并将它们放到内存里,而是查询到有多少记录行存在就输出多少个“1”,每个“1”代表有1行记录。

选用数字1是因为它所占用的内存空间最小,用数字0的效果也一样,即:SELECT 0 FROM TABLE。

从效率上来说,SELECT 1 > SELECT 字段 > SELECT *

在子查询中的应用
常规写法

SELECT * FROM t1 a WHERE EXISTS (SELECT * FROM t2 b WHERE a.id = b.id)

更优写法

SELECT * FROM t1 a WHERE EXISTS (SELECT 1 FROM t2 b WHERE a.id = b.id)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1166930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

凝聚伙伴力量,共赢产业未来—— 麒麟信安云展信创重庆站活动圆满召开

志合越山海,聚力共前行!11月1日下午,麒麟信安云展信创重庆站圆满召开。 本次活动邀请业内专家、权威机构、行业客户、合作伙伴齐聚一堂,围绕产业新机遇、新挑战,产业政策及趋势等内容展开研讨交流,同时分享…

【SFM】《Structure-from-Motion Revisited》

论文 论文代码 资料 cvpr2017 COLMAP 文章目录 2. 本文贡献2.1 Scene Graph Augmentation 场景图增强2.2 Next Best View Selection下一个最佳视图选择2.3 鲁棒高效的三角化 2.4 BA(Bundle Adjustment)2.4.1 参数化求解方法2.4.2 过滤2.4.3 再三角化&…

企业大数据挖掘平台推荐

大数据挖掘平台适合哪些应用场景呢? 1、适合大型企业 分布式云计算,线性扩展,保证性能,与BI平台无缝整合,一键发布挖掘模型,模型库提高知识复用,减少重复投入,支持跨库…

当科技遇上神器:用Streamlit定制AI可视化问答界面

Streamlit是一个开源的Python库,利用Streamlit可以快速构建机器学习应用的用户界面。 本文主要探讨如何使用Streamlit构建大模型外部知识检索的AI问答可视化界面。 我们先构建了外部知识检索接口,然后让大模型根据检索返回的结果作为上下文来回答问题。…

UPS设备还只知道人工巡检?这个神器你一定要试试!

随着电子设备在我们的生活和工作中扮演越来越重要的角色,电力的可靠性变得至关重要。不间断电源系统作为一种关键设备,可以提供电力备份,以保障设备在电力中断或波动的情况下能够正常运行。然而,UPS设备的有效监控和管理对于确保其…

unity 使用TriLib插件动态读取外部模型

最近在做动态加载读取外部模型的功能使用了triLib插件,废话不多说直接干货。 第一步下载导入插件,直接分享主打白嫖共享,不搞花里胡哨的。 链接:https://pan.baidu.com/s/1DK474wSrIZ0R6i0EBh5V8A 提取码:tado 导入后第…

录屏软件免费版,精选3款,助你轻松录制!

录屏软件在今天的数字时代中扮演着重要的角色,无论是为了创建教育教程、分享游戏成就,还是记录计算机上的操作步骤。然而,许多用户面临付费和高级功能的限制,很难找到合适的免费录屏软件。那录屏软件免费版都有哪些呢?…

SpringBoot整合Activiti7——全局监听器(八)

文章目录 一、全局监听器事件类型配置方式(选)日志监听器代码实现xml文件创建全局监听器全局配置类测试流程部署流程启动流程 一、全局监听器 它是引擎范围的事件监听器,可以捕获所有的Activiti事件。 事件类型 ActivitiEventType 枚举类中包含全部事件类型 配置方…

【接口测试】Postman登录接口鉴权实战案例,跟着大牛通关...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 在做接口测试的时…

双十一快递“当天达”?宏电助力物流分拣系统高效运行

​众所周知,每年双11都是快递业务的高峰期,是对各大物流企业运输能力的一次大考。为了持续提升快递配送的速度,自动化物流仓储建设的速度也在不断的加快,而在一个完整的自动化物流仓储系统中,输送分拣设备是物流自动化…

掌握视频剪辑技巧:高手教您如何批量减少片头时长并调整播放倍速

随着社交媒体的普及,视频已经成为人们传递信息、表达观点的重要方式。而视频剪辑则是在这个过程中不可或缺的一环。在视频剪辑过程中,时长是一个重要的因素。有时候,我们需要对视频进行裁剪,以减少其时长。今天,我们讲…

分享一下在微信小程序里怎么做一个投票链接

在当今信息化社会,投票已成为各行各业收集意见、汇聚智慧的重要手段。传统的投票方式往往需要投入大量人力物力,而如今,借助微信小程序,我们可以在几分钟内创建一个高效、便捷的投票平台。本文将详细介绍如何在微信小程序中添加投…

OpenCV检测圆(Python版本)

文章目录 示例代码示例结果调参 示例代码 import cv2 import numpy as np# 加载图像 image_path DistanceComparison/test_image/1.png image cv2.imread(image_path, cv2.IMREAD_COLOR)# 将图像转换为灰度 gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用高斯模糊消除…

喜讯!云起无垠获评GEEKCON 2023“前沿突破奖“

近日,“GEEKCON 2023”中国站的比赛在上海西岸艺术中心成功举办。这场活动围绕着人工智能与专业安全的前沿技术展开了深入的探讨和实践活动。本次活动特设五大系列专场:“对抗研判 AVSS挑战赛”、“深蓝洞察之特别披露”、“年度主题大碰撞:G…

分享74个Python管理系统源代码总有一个是你想要的

分享74个Python管理系统源代码总有一个是你想要的 源码链接:https://pan.baidu.com/s/1JXFePOOk_ot4Jdu6_RylOg?pwd8888 提取码:8888 项目名称 ais系统后台项目,基于python flask框架 BNUZ教务系统认证爬虫Python语言实现,你…

java服务器环境配置以及项目搭建

一. 内容简介 使用Mavn聚合工程,springboot整合spring,springmvc,mybatis框架,完成项目搭建 二. 软件环境 2.1 java 1.8.0_144 2.2 mysql Ver 8.0.30( 8.10的好像出问题,我给重装了) 2.3 IntelliJ IDEA 2023.1 2.4 Apache Maven 3.9.5 …

冬天女儿的羽绒服就选它了,哈哈很喜欢

长款设计感满满的羽绒服 真的一下子就戳中了我的心巴 90白鸭绒+杜邦三防工艺+精细压线 厚实保暖不臃肿,粉色撞色甜美又可爱

【MongoDB】索引 - 单字段索引

MongoDB支持在集合文档中的任意字段上创建索引,默认情况下所有的集合都有一个_id字段的索引,用户和应用可以新增索引用于查询和操作。 一、准备工作 这里准备一些学生数据 db.students.insertMany([{ _id: 1, name: "张三", age: 20, clas…

springboot整合七牛云oss操作文件

文章目录 springboot整合七牛云oss操作文件核心代码(记得修改application.yml配置参数⭐)maven依赖QiniuOssProperties配置类UploadControllerResponseResult统一封装响应结果ResponseType响应类型枚举OssUploadService接口QiniuOssUploadServiceImpl实现…

劳务派遣派遣人员如何缴纳保险

《劳动合同法》规定:劳务派遣协议应当约定派遣人员的社会保险费的数额与支付方式以及违反协议的责任。可见,由哪一方为劳务派遣人员缴纳各项社会保险是由劳务派遣公司和实际用工单位协商确定的。但不管如何约定,劳务派遣单位或用工单位都必须…