很多熟悉SQL server的朋友在接触到oracle的时候经常犯的一个错误就是总以为oracle中也会有update from这种结构。请你死了这条心吧,在oracle中的update语句中不存在from语句。
前面我们简单介绍过Oracle的update语句。这里我们重点介绍如果基于别的表来更新当前表的update语法。
我们知道在oracle中的例子数据库中有名为scott的schema,里面有一个表是emp,我们就拿这里表来举例
先建立一个结构一模一样的表emp1,并为其插入部分数据
create table emp1
as
select * from emp where deptno = 20;
update掉emp1中的部分数据
update emp1
set sal = sal + 100,
comm = nvl(comm,0) + 50
然后我们试着使用emp1中数据来更新emp中sal 和 comm这两列数据。
我们可以这么写
Update emp
Set(sal,comm) = (select sal,comm. From emp1 where emp.empno = emp1.empno)
Where exists (select 1 from emp1 where emp1.empno = emp.empno)
请你尤其注意这里的where子句,你可以尝试不写where子句来执行以下这句话,你将会使得emp中的很多值变成空。
这是因为在oracle的update语句中如果不写where子句,oracle将会默认的把所有的值全部更新,即使你这里使用了子查询并且某在值并不能在子查询里找到,你就会想当然的以为,oracle或许将会跳过这些值吧,你错了,oracle将会把该行的值更新为空。
我们还还可以这么写:
update (select a.sal asal,b.sal bsal,a.comm acomm,b.comm bcomm from emp a,emp1 b where a.empno = b.empno)
set asal = bsal,
acomm = bcomm;
这里的表是一个类视图。
当然你执行时可能会遇到如下错误:
ERROR 位于第 2 行:
ORA-01779: 无法修改与非键值保存表对应的列
这是因为新建的表emp1还没有主键的缘故
下面增加一个主键
alter table emp1
add constraint pk_emp1 primary key (empno);
执行之后
在执行前面的语句就能成功。
这里我们总结一下:
在oracle中不存在update from结构,所以遇到需要从另外一个表来更新本表的值的问题的时候,有两种解决的办法:
一种是使用子查询,使用子查询时一定要注意where条件(一般后面接exists子句),除非两个表是一一对应的,否则where条件必不可少,遗漏掉where条件时可能会导致插入大量空值。
另外一种是类视图的更新方法,这也是oracle所独有的。先把对应的数据全部抽取出来,然后更新表一样更新数据,这里需要注意的是,必须保证表的数据唯一型。
分享到:
相关推荐
在本篇文档中,作者详细总结了在实际项目中针对Oracle数据库的update语句优化的四种方案。以下是对这四种方案的知识点进行详细的阐述: 1. 标准update语法优化: 当面对单表更新或较简单的SQL语句时,可以直接使用...
Oracle数据库中的多表关联UPDATE语句是用于在一个表中更新数据时,依据另一个表的条件进行操作的关键技术。这在处理复杂的数据同步或修正场景时非常有用。在本例中,我们将探讨如何利用多表关联来更新数据,并通过...
### ORACLE UPDATE 语句语法与性能分析 ...在实践中,应根据具体的应用场景灵活选择和调整`UPDATE`语句的语法结构,并结合Oracle提供的性能分析工具,不断优化和改进数据更新操作,以达到最佳的系统性能表现。
- **UPDATE**: 修改现有表中的数据。 - **DELETE**: 删除表中的行。 - **CREATE**: 创建新的数据库对象,如表、视图等。 - **DROP**: 删除现有的数据库对象。 - **ALTER**: 修改已存在的数据库对象结构。 - **...
**问题**: Oracle中的ROWID是什么样的结构? **解答**: ROWID是一种特殊的伪列,用于标识表中的每一行。ROWID包含了行所在的表空间、数据块号和行号等信息。 - **示例**: 获取ROWID的结构: ```sql SELECT ROWID ...
在Oracle中创建触发器使用CREATE TRIGGER语句,基本语法为CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE/DELETE ON table_name FOR EACH ROW; 17. 如何管理用户权限? 通过GRANT语句赋予用户权限,...
Oracle是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据重要地位。Oracle数据库提供了丰富的功能,包括数据存储、查询、事务处理、安全性等。在本文中,我们将深入探讨Oracle的使用,特别是通过...
如果我们的数据库设计只包含一个表`Ttest`来表示层级关系(即`Ttest.parentId = Ttest.id`),我们可以修改上面的`UPDATE`语句,将`FROM`子句中的表也设定为`Ttest`,但需要为其中一个实例赋予别名以区分它们: ...
Oracle PL/SQL 结构控制语句是 PL/SQL 语言中的一种基本结构,用于控制程序的逻辑流程。结构控制语句可以分为两种:分支结构和循环结构。在本篇文章中,我们将详细介绍 Oracle PL/SQL 结构控制语句的使用方法和示例...
### ORACLE 多表查询与数据修改 ...通过本次实验的学习,您可以更加熟练地掌握Oracle数据库中的多表查询技巧,以及基本的INSERT、UPDATE和DELETE操作。这对于日常的数据库管理和开发工作都是非常有用的技能。
使用PL/SQL语言中的游标和循环结构,逐条记录地读取并更新数据。 ```plsql declare l_varID varchar2(20); l_varSubName varchar2(30); cursor mycur is select T2.Id, T2.Subobject_Name from T2; begin open ...
4. **数据库架构**:理解Oracle的物理和逻辑结构,如表空间、数据文件、重做日志、控制文件等,有助于管理和优化数据库性能。此外,还要熟悉体系结构中的其他组件,如实例、进程和内存结构。 5. **安全性管理**:...
本篇文章将深入探讨“表结构和数据”这一主题,主要涉及SQL和Oracle数据库的相关知识点。 首先,我们要理解什么是表结构。在数据库中,表是一种基本的数据组织形式,类似于电子表格。表由一系列行和列组成,每一行...
本实验涵盖了 Oracle 中的视图概念、创建视图、显示视图的内容、从数据字典视图中选择视图的名字和文本、使用视图查询数据、创建带有条件的视图、显示视图的结构和内容、更新视图、创建复杂视图等内容,为读者提供了...
在数据库管理中,UPDATE语句用于修改已存在的数据记录,而SELECT语句则用于查询数据。在某些场景下,我们可能需要从UPDATE语句转换为SELECT语句,以验证更新操作将影响哪些行或者理解更新逻辑。这在调试、数据分析或...
### Oracle异库同表名的两个数据库中数据合并或数据表结构的修改 在Oracle数据库管理与维护过程中,经常会遇到需要处理多个不同数据库之间数据同步、数据合并以及表结构更改等问题。本文将针对“Oracle异库同表名的...
在Oracle中,改变表结构尤其是字段的顺序并非一件简单的事情。由于Oracle并不支持直接调整字段顺序的功能,因此大多数情况下,人们会选择备份数据、删除原表然后根据新需求重建表的方式。这种方式虽然能够解决问题,...
Oracle SQL,全称为结构化查询语言在Oracle数据库环境中的应用,是数据库管理员和开发人员用于检索、更新和管理Oracle数据库的核心工具。Oracle SQL是SQL标准的扩展,它提供了许多特有的功能,以满足企业级数据库...
- `ALTER TABLE`:允许修改已有表的结构。 - `DROP TABLE`:允许删除表。 - `SELECT`:允许查询任何表的数据。 - `INSERT`:允许向任何表插入数据。 - `UPDATE`:允许更新任何表的数据。 - `DELETE`:允许从...
Oracle 查询语句大全是 Oracle 数据库管理系统中最基本也是最重要的组成部分,用于管理和维护数据库。本文将详细介绍 Oracle 查询语句的使用方法和实践操作。 一、创建用户和授权 在 Oracle 中,创建用户和授权是...