Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Oracle中的三种 UPDATE FROM 的解决方案

Oracle中的三种 UPDATE FROM 的解决方案

作者头像
用户1148526
发布于 2018-01-03 07:53:03
发布于 2018-01-03 07:53:03
1.3K0
举报
文章被收录于专栏:Hadoop数据仓库Hadoop数据仓库

表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。象sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式中引用要更新的表以外的其它数据。

例如:

代码语言:txt
AI代码解释
复制
UPDATE dbo.Table2 
代码语言:txt
AI代码解释
复制
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB
代码语言:txt
AI代码解释
复制
FROM dbo.Table2 
代码语言:txt
AI代码解释
复制
INNER JOIN dbo.Table1 
代码语言:txt
AI代码解释
复制
ON (dbo.Table2.ColA = dbo.Table1.ColA);

实际更新的操作是在要更新的表上进行的,而不是在from子句所形成的新的结果集上进行的。

Oracle没有update from语法,可以通过三种写法实现同样的功能:

1:子查询UPDATE A SET A.NAME=(SELECT B.NAME FROM B WHERE B.ID=A.ID),本查询要根据具体情况看看是否变通成如下

代码语言:txt
AI代码解释
复制
UPDATE A SET A.NAME=(SELECT B.NAME FROM B WHERE B.ID=A.ID) WHERE A.ID IN (SELECT ID FROM B);

2:利用视图来做

代码语言:txt
AI代码解释
复制
UPDATE (SELECT A.NAME ANAME,B.NAME BNAME FROM A,B WHERE A.ID=B.ID)
代码语言:txt
AI代码解释
复制
SET ANAME=BNAME;

例如:

代码语言:txt
AI代码解释
复制
UPDATE tablea a
代码语言:txt
AI代码解释
复制
SET a.fieldforupdate = (SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield)
代码语言:txt
AI代码解释
复制
WHERE EXISTS (SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield);

有三点需要注意: 1. 对于一个给定的a.keyfield的值,SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield 的值只能是一个唯一值,不能是多值。 2. 在绝大多数情况下,最后面的where EXISTS子句是重要的,否则将得到错误的结果。 3. 对于视图更新的限制: 如果视图基于多个表的连接,那么用户更新(update)视图记录的能力将受到限制。除非update只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。

3:使用PL/SQL

代码语言:txt
AI代码解释
复制
DECLARE
   TYPE product_id_tab IS TABLE OF products.product_id%TYPE;
BEGIN
/* Retrieve all values of Product_Id that are relevant */
   SELECT /*+ FULL(PRODUCTS) */
          product_id
   BULK COLLECT INTO product_id_tab
     FROM products
    WHERE product_name LIKE 'A%';
代码语言:txt
AI代码解释
复制
   FORALL i IN 1 .. product_id_tab.LAST
      UPDATE products
         SET reorder_level = (reorder_level * 0.8)
       WHERE product_id = product_id_tab (i);
/* Do more processing */
END;
/
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年12月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
mysql中创建表实例全析及查询基本操作
create table cats( id int not null auto_increment, pid int not null default '0', name varchar(60) not null default '', desn text not null default '', primary key(id), index name(name, pid) )engine=InnoDB default character set=utf8;
闵开慧
2018/03/30
1.6K0
挽救数据库性能的30条黄金法则
1. 优化查询,应尽量避免全表扫描,应该在用于检索数据和排序数据的字段上建立索引,如where子句用于搜索,order by子句用于排序,所以在这两个子句涉及到的字段上需要建立索引。
蒙娜丽宁
2020/05/25
4800
SQL进阶-8-集合运算
SQL进阶-8-利用SQL进行集合运算 SQL本身就是以集合作为基础的,本文中记录的是利用各种集合运算。 交集 并集 差集 异或集 交集 内连接相当于是求两个集合的交集,相当于是集合的积(inters
皮大大
2021/03/01
5280
SQL进阶-8-集合运算
Oracle查看分析执行计划、建立索引以及SQL优化
Step2: select * from table(dbms_xplan.display)
chenchenchen
2022/03/09
4.5K0
Oracle查看分析执行计划、建立索引以及SQL优化
复盘eygle在甲骨文大会上演讲中的示例,看看什么是大师的由点及面
盖总(eygle)在刚结束的甲骨文大会的演讲中,通过一个简单的UPDATE语句,为我们展示了什么叫由点及面的优化,什么叫由点及面的知识覆盖度,不在于这个案具体如何操作,更应关注或更值得我们借鉴的是这种学习态度和方法思路,大师是如何炼成的?我想这个案例可以带给我们一些启迪。
bisal
2019/01/29
5470
使用LEFT JOIN实现多表查询
最近,发现车间在使用条码打印系统打印的时候,为了打印条码,从系统生产任务单中一个一个复制到EXCEL表中,然后根据事先设置的模板进行批量打印,这种重复性的CTRL+C和CTRTL+V不但效率低,而且还容易出错。
好派笔记
2021/09/14
1.3K0
Oracle 与 MySQL 的差异分析(4):SQL写法
MySQL 中字符串既可以用单引号也可以用双引号,而 Oracle 中只能用单引号。
一头小山猪
2020/04/10
1.2K0
Oracle查询优化-04插入、更新与删除数据
然而,如果语句中没有列出要插入行中的目标字段,则必须要插入表中的所有列,需要注意的,在插入值列表中所列出的值的顺序,必须与select * 查询语句所列出的列顺序完全一致。
小小工匠
2021/08/16
1.3K0
一些sql用法例子【Updating】
1、利用instr连接表做字段查询,group_concat做值的合并: create table ab(product_id int,product_name varchar(10), product_type_id varchar(10)); insert into ab values(1,'产品A','1,2'),(2,'产品B','2,3'); create table ac(product_type_id int,product_type_name varchar(10)); insert
用户1177713
2018/02/24
1.8K0
数据库去重有几种方法_去重数据库
可以看到“ALLEN”和“SMITH”这两个人的数据重复了,现在要求表中name重复的数据只保留一行,其他的删除。
全栈程序员站长
2022/11/10
4K0
数据库去重有几种方法_去重数据库
select for update和select for update wait和select for update nowait的区别
CREATE TABLE "TEST6" ( "ID" VARCHAR2(30), "NAME" VARCHAR2(30), "AGE" NUMBER(2,0), "SEX" VARCHAR2(2), "ENAME" VARCHAR2(30), "ADDTIME" DATE ) insert into TEST6 (id, name, age, sex, ename, addtime) values ('1', '张三', 18, null, 'zha
郑小超.
2018/01/26
2.7K0
PL/SQL --> INSTEAD OF 触发器
INSTEAD OF 触发器常用于管理编写不可更新的视图,INSTEAD-OF触发器必须是行级的。
Leshami
2018/08/07
6550
SQL语句大全中的sql语句备忘录—sql日常使用指北
CRUD:增查改删,即,create/read/update/delate 主要被用在描述软件系统中数据库或者持久层的基本操作功能
周陆军博客
2023/05/19
1.1K0
记录容易忘记的方法
提取每个分类前n条记录 SELECT ID, Name, CategoryID FROM TableName AS a WHERE (ID IN (SELECT TOP (n) ID FROM TableName AS b WHERE (a.CategoryID = CategoryID))) 0、更改数据库的路径 USE master Go ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILE
用户1174620
2018/02/26
6500
记录容易忘记的方法
SQL之经典SQL语句大全
经典SQL语句大全 一、基础 1、说明:创建数据库 CREATE DATABASE database-name  2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack  4
互联网金融打杂
2018/04/03
1.4K0
经典SQL语句大全之数据开发
1.按姓氏笔画排序: Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多
陈珙
2018/09/12
9720
Sqlite的多表连接更新
最近处理一个较大数据的sqlite库,基础表300万条,结果表30万条左右,我的笔记本跑起来还算流畅。最后结果,需要两个表连接,把另一个表的计算结果更新过来,却遇到麻烦。sqliter并不支持常见的连接更新: update a set a.id =b.id from table_1 a inner join table_2 b on a.name=b.name 查了一下,只能这样: update table1 set col1=(select col1 from table2 where col2=tab
用户1075292
2018/01/23
2.2K0
特殊SQL语句及优化原则
1.按姓氏笔画排序:Select*FromTableNameOrderByCustome数据库
Java架构师必看
2021/03/22
6540
Oracle 问题小结
1.级联更新 //例子1 update (select a.name aname,b.name bname from test1 a,test2 b where a.no=b.no) set aname=bname; //例子2 update test1 a set name=(select name from test2 b where a.no=b.no) where exists(select name from test2 b where a.no=b.no); 2.使用oracle中的
hbbliyong
2018/03/05
7680
MySQL应用之CROSS JOIN用法简介教程
MySQL cross join是mysql中的一种连接方式,区别于内连接和外连接,对于cross join连接来说,其实使用的就是笛卡尔连接。在MySQL中,当CROSS JOIN不使用WHERE子句时,CROSS JOIN产生了一个结果集,该结果集是两个关联表的行的乘积。通常,如果每个表分别具有n和m行,则结果集将具有n*m行
SmileNicky
2019/11/04
9.3K0
推荐阅读
相关推荐
mysql中创建表实例全析及查询基本操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档