Oracle多表关联的update和delete

由于Oracle不支持update或delete from语句,因此,Oracle的多表关联update和delete必须借助于 子查询,同理,Oracle也不支持同时update或delete多张表,其典型用法如下:

多表关联update

首先,构造测试表和数据如下:

SYS@TEST16> create table testa as select owner,table_name,status from dba_tables;  

Table created.
SYS@TEST16> create table testb as select owner,object_name,status from dba_objects;  

Table created.

1)更新testa表的status=‘VALID’,关联条件为testa.owner=testb.owner and testa.table_name=testb.table_name

update testa a set status='VALID'

where exists (select 1 from testb b where a.owner=b.owner and a.table_name=b.object_name);

2)更新testa表的status等于testb表的status,关联条件同上

update testa a

set a.status=(select b.status from testb b where a.owner=b.owner and a.table_name=b.object_name)

where exists (select 1 from testb b where a.owner=b.owner and a.table_name=b.object_name);

这里要注意的是:只有当子查询每次只返回1条或0条数据时,上述语句才能执行成功,如果返回超 过1条数据,将会出现如下错误:

ORA-01427: single-row subquery returns more than one row

这时候,你就必须得对子查询里的返回条数进行限定,如rownum=1或distinct等方法。

这里的 where exists字句是不可以省略的,否则将update全表!这里要千万小心。

如果查看执行计划,你 会发现上述的update语句将扫描testb表两次,如果该表比较大的话,对性能会有影响,如果只想扫描 一次的话,可以用如下方法代替:

update testa a

set a.status=nvl((select b.status from testb b where a.owner=b.owner and a.table_name=b.object_name),a.status);

update自身列

有时候,可能需要利用自身的值更新自身的列,比如表test的列col1,col2有空格 ,我们需要trim去除空格,这时候我们就可以利用rowid更新,update语句如下:

update test a
set (col1,col2)=
(select trim(b.col1),trim(b.col2) from test b
where  a.rowid=b.rowid)
where exists
(select 1 from test b
where  a.rowid=b.rowid)

多表关联delete

1)利用in或not in删除数据

delete from testa where table_name

in (select object_name from testb);

2)利用exists或not exists删除数据

delete from testb b
where exists
(select 1 from testa a where a.owner=b.owner and a.table_name=b.object_name)

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索select
, 多表关联
, update
, where
, status
, 语句关联
, from
, delete from
, owner
, 自身关联
, yii2多表关联查询
, 多表关联搜索
, 删除多表
多表删除
oracle delete 关联、oracle delete 关联表、oracle 关联update、oracle update 表关联、oracle多表关联update,以便于您获取更多的相关知识。

时间: 2024-08-29 13:16:53

Oracle多表关联的update和delete的相关文章

Oracle 多表关联更新

drop table course; create table course ( id integer, teacherNo integer, teacherDesc varchar2(100), teacherName varchar2(50), courseName varchar2(50) ); insert into course values(1,100,'Mr.zhang','ZhangSan','English'); insert into course values(2,101,

Oracle\MS SQL Server Update多表关联更新

原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表   一.MS    SQL    Server   多表关联更新      sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来.虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就

两表(多表)关联update的写法 .

原文:两表(多表)关联update的写法 . 关于两表关联的update,可以把SQL写成了在SQL Server下面的特有形式,但是这种语法在Oracle下面是行不通的    update customers a    set    city_name=(select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id)   where  exists (select 1                   fr

SQL update 多表关联更新的实现代码

实现多表更新,尤其是A表和A的子表B表数据更新,下面是例子 有A.B张表,其记录如下: A表 c1       c2 -------------- 1       a1 2       a2 3       a3 8       a8 B表 c1       c3 -------------- 1        b1 2        b1 3        b3 10      b10 A.c1与B.c1相等,用一条sql语句,实现A.c2的值更新为B.c3 -----------------

oracle 两表递归关联查询

问题描述 oracle 两表递归关联查询 哪位大神帮忙指点下,现表A有字段a,b,c 表B有字段d 然后用表A和表B关联,先使用表B的字段d和表A的字段c关联如果关联不上,再用表B的字段d和表A的字段b关联,如果关联不上在用表B的d字段和表A的字段a进行关联,其中表A的字段c从属字段b,字段b从属字段a 解决方案 Oracle创建两表关联查询的视图查询oracle约束所关联的表查询oracle约束所关联的表 解决方案二: 有点像地市层级.但数据库不会这样设计把. 直接 用or将3种关联 联系起来

sql 数据库 如何使用update set 解决多表关联修改数据

问题描述 sql 数据库 如何使用update set 解决多表关联修改数据 A表: stuid testid 1 2 3 4 5 1 1 2 1 3 1 1 2 2 2 3 2 B表: stuid testid 1 2 3 4 5 1 1 A B C D A 2 1 B B C A A 3 1 C D A A B 1 2 C C D D D 2 2 B A C A A 3 2 D A D C D C表: testid stid daan fs 1 1 A 3 1 2 B 3 1 3 C 3 1

sqlserver 多表更新/关联更新update详解

反复尝试多次,最后得出结论,sqlserver 多表关联update 时,外部的表 不能加 as 别名,会报语法错误. 只可以写 表名做前缀来引用 不能 用别名 引用. 语法可以参考下面 update A SET 字段1=B表字段表达式, 字段2=B表字段表达式   from B WHERE    逻辑表达式 例如:  代码如下 复制代码 UPDATE dbo.Table2 SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB FROM

oracle清空表sql语句 以及Truncate与delete区别

oracle清空表sql语句 以及truncate与delete区别 truncate table [表名] 使用truncate语句从表中删除或群集的所有行.默认情况下,oracle数据库教程也将执行以下任务: 解除分配的唯一例外的是删除的行中使用的所有存储空间由minextents指定参数 下次存储参数设置的从进程的truncate部分取消了最后的范围大小 删除与truncate语句行可以比下降并重新创建表有效.跌落并重新创建一个表的表无效依赖的对象,需要你在桌子上补对象的特权,并要求您重新

使用外部表关联MySQL数据到Oracle

因为业务需要,有个临时的活动需要DBA来支持一些数据业务,问题来了,需要从MySQL端同步一部分数据到Oracle端,然后从Oracle端匹配查到相应的数据返回给MySQL,至于原因,也是不同的业务系统,不同的权限分配,还没法做到一个应用端去读取这些信息,而且也有安全的考虑,大体就是两部分的数据也是互相补充,但又彼此独立,是一个全集和子集的关系. 这个流程本来从开发的角度来看似乎是一头雾水,所以交给他们来规划就容易出现问题,最后沟通后的流程是下面的形式. 下面这个图左边是Oracle的环境,右边