ORACLE多表关联UPDATE 语句

1) 最简单的形式

SQL 代码

--经确认customers表中所有customer_id小于1000均为‘北京‘

--1000以内的均是公司走向全国之前的本城市的老客户:)
update customers
set city_name=‘北京‘
where customer_id<1000

2) 两表(多表)关联update -- 仅在where字句中的连接

SQL 代码

--这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别
update customers a -- 使用别名
set customer_type=‘01‘ --01 为vip,00为普通
where exists (select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)

3) 两表(多表)关联update -- 被修改值由另一个表运算而来

SQL 代码

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
from tmp_cust_city b
where b.customer_id=a.customer_id
)
-- update 超过2个值
update customers a -- 使用别名
set (city_name,customer_type)=(select b.city_name,b.customer_type
from tmp_cust_city b
where b.customer_id=a.customer_id)
where exists (select 1
from tmp_cust_city b
where b.customer_id=a.customer_id
)

-- 方法1.

UPDATE  表2

SET

  表2.C  =  (SELECT  B  FROM  表1  WHERE   表1.A = 表2.A)

WHERE

  EXISTS ( SELECT FROM   表1  WHERE   表1.A = 表2.A)

  

-- 方法2

MERGE INTO 表2 

USING 表1

ON ( 表2.A = 表1.A )    -- 条件是 A 相同

WHEN MATCHED THEN UPDATE SET 表2.C = 表1.B   -- 匹配的时候,更新

二,

oracle随机读取表中的N条数据方法:

1) select from (select from tablename order by sys_guid()) where rownum < N; 

2) select from (select from tablename order by dbms_random.value) where rownum< N; 

3) select *  from (select from table_name sample(10)   order by trunc(dbms_random.value(0, 1000)))  where rownum < N;

说明: 
  sample(10)含义为检索表中的10%数据,sample值应该在[0.000001,99.999999]之间,其中 sys_guid() 和 dbms_random.value都是内部函数

注:
  在使1)方法时,即使用sys_guid() 这种方法时,有时会获取到相同的记录,即:和前一次查询的结果集是一样的(可能是和操作系统有关:windows正常,linux异常;也可能是因为sys_guid()函数本身的问题,有待继续研究)
  所以,为确保在不同的平台每次读取的数据都是随机的,建议采用2)和3)两种方案,其中2)方案更常用。3)方案缩小了查询的范围,在查询大表,且要提取数据不是很不多的情况下,会对查询速度上有一定的提高

时间: 2024-10-29 10:46:36

ORACLE多表关联UPDATE 语句的相关文章

[转载] ORACLE 多表关联 UPDATE 语句

为了方便起见,建立了以下简单模型,和构造了部分测试数据:在某个业务受理子系统BSS中, SQL 代码 1 --客户资料表 2 create table customers 3 ( 4 customer_id number(8) not null, -- 客户标示 5 city_name varchar2(10) not null, -- 所在城市 6 customer_type char(2) not null, -- 客户类型 7 ... 8 ) 9 create unique index P

ORACLE 多表关联 UPDATE 语句

为了方便起见,建立了以下简单模型,和构造了部分测试数据:在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create table customers ( customer_id number(8) not null, -- 客户标示 city_name varchar2(10) not null, -- 所在城市 customer_type char(2) not null, -- 客户类型 ... ) create unique index PK_customers on cus

oracle多表关联update

日常的开发中一般都是写的单表update语句,很少写多表关联的update. 不同于SQL Server,在Oracle中,update的多表连接更新和select的多表连接查询在使用的方法上存在较大差异. 语法比较难以说得清楚,直接上例子就妥了. update diosos_01 d1 set d1.name = ( select d2.name from diosos_02 d2 where d1.code = d2.code ) where d1.code is not null; 特别之

Oracle中如何实现Mysql的两表关联update操作

在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.price WHERE items.id=month.id; 在MySQL中构造表验证了一下 mysql> select * from test; +------+--------+ | id | salary | +------+--------+ | 1 | 100 | | 2 | 200 | | 3

两表(多表)关联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                   from 

oracle多表关联更新

oracle的更新语句不通MSSQL那么简单易写,就算写出来了,但执行时可能会报 这是由于set哪里的子查询查出了多行数据值,oracle规定一对一更新数据,所以提示出错.要解决这样必须保证查出来的值一一对应. 原理 Update语句的原理是先根据where条件查到数据后,如果set中有子查询,则执行子查询把值查出来赋给更新的字段,执行更新. update dept a    set a.loc = (select b.loc from test_dept b where a.deptno =

Oracle两表关联(join)更新字段值一张表到另一张表

[采用视图更新的方式] 有需求A表,B表,需要将B表中的name字段更新到A表中的name,两表有id关联,代码如下: update  (select a.name aname, b.name bname from A a, B b where a.id = b.id) set aname = bname; --注:两表关联属性id必须为unique index或primary key

MySQL千万级多表关联SQL语句调优

本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使千万级表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果). 需要优化的查询:使用explain 出现了Using temporary: 有分页时出现了Using filesort则表示使用不了索引,需要根据下面的技巧来调整语句 rows过多,或者几乎是全表的记录数: key 是 (NULL): possible_keys 出现过多(待选)索引. 1.使用explain语法,对SQL进行

Oracle 关联两表写update语句

两种方法: -- 方法1. UPDATE  表2 SET   表2.C  =  (SELECT  B  FROM  表1  WHERE   表1.A = 表2.A) WHERE   EXISTS ( SELECT 1 FROM   表1  WHERE   表1.A = 表2.A)    -- 方法2 MERGE INTO 表2  USING 表1 ON ( 表2.A = 表1.A )    -- 条件是 A 相同 WHEN MATCHED THEN UPDATE SET 表2.C = 表1.B