·MERGE INTO的基本语法
MERGE INTO table[alias]
Using table or sql query [alias]
On (condition)
When matched then
Update set ….
When not matched then
Insert values…
--------
-- 注意:
-- 1) 后面的Update和Insert 是简化了的Update,Insert语句
-- 2) merge语句应该保证on中的条件的唯一性,另外一点需要说明的是using关键字后面可以接表,当然也可以接其他的select语句做出来的一个类视图。
--------
例如:
--------
merge into user_info t1
using user_info_temp t2
on(t1.msisdn=t2.msisdn)
when matched then
update set
t1.prov_id = decode(t1.CREATE_TIME,greatest(t1.CREATE_TIME,t2.CREATE_TIME),t1.prov_id,t2.prov_id),
t1.city_id = decode(t1.CREATE_TIME,greatest(t1.CREATE_TIME,t2.CREATE_TIME),t1.city_id,t2.city_id),
t1.user_type = decode(t1.CREATE_TIME,greatest(t1.CREATE_TIME,t2.CREATE_TIME),t1.user_type,t2.user_type),
t1.create_time =decode(t1.CREATE_TIME,greatest(t1.CREATE_TIME,t2.CREATE_TIME),t2.create_time,t1.create_time),
t1.reg_type=t2.reg_type,
t1.update_time = decode(t2.CREATE_TIME,greatest(nvl(t1.update_time,t1.CREATE_TIME),t2.CREATE_TIME),
t2.CREATE_TIME,nvl(t1.update_time,t1.CREATE_TIME)),
t1.imsi = decode(t1.CREATE_TIME,greatest(t1.CREATE_TIME,t2.CREATE_TIME),t1.imsi,t2.imsi)
when not matched then
insert (msisdn ,user_type , reg_type , city_id , prov_id , create_time , update_time , imsi)
values (t2.msisdn,t2.user_type,t2.reg_type,t2.city_id,t2.prov_id,t2.create_time,t2.create_time,t2.imsi)
;
·批量插入和批量更新
--1 批量插入
insert into wuzs_province
(provid, provname, odid, provcode)
select distinct provid, provname, -1, provid from tmp_province;
--2 update的批量更新
update user_info t
set t.reg_type = (select reg_type from user_info_temp t2 where t.msisdn = t2.msisdn)
-- 这种批量更新有个注意的地方,如果括号里面的连接条件不符合时,则t.reg_type 会被赋值为null。得慎重!
-- 可以在后面的where条件中设置条件,例如:
update dev_info t1 set
(t1.model_id,t1.MANU_ID,t1.SW_VERSION) =
(SELECT T2.MODEL_ID,T2.MANU_ID,T2.SW_VERSION
FROM BAK2_UDPAIR_HIS T2
WHERE t1.imei=t2.imei
)
where t1.change_reason in (7,8)
and exists
(SELECT 1
FROM BAK2_UDPAIR_HIS T2
WHERE t1.imei=t2.imei
);
--3 使用merge进行批量更新
merge into tac_info_temp t1
using (select a.manu_name, b.model_name, b.model_id
from manufacturer a, model b
where a.manu_id = b.manu_id) t2
on (t1.manu_name = t2.manu_name and t1.model_name = t2.model_name)
when matched then
update set t1.model_id = t2.model_id
·表分区有关的知识:
1. 分区的有哪些种类?如何创建相应的分区?
Oracle提供了以下几种分区类型:
范围分区(range);
哈希分区(hash);
列表分区(list);
范围-哈希复合分区(range-hash);
范围-列表复合分区(range-list)。
2. oracle的分区表的索引、表空间 都有global、local之分。
全局索引就是说索引段是一个;
本地索引它的索引段与分区段是一一对应的.
有多少个分区段,就有多少个索引段,
3. 分区的优势?
1) 可以在查询时指定分区以大量提高速度,例如:select * from dinya_test partition(part_01);
2) 如果没有指定分区而全部遍历分区时,也可以提高查询的速度。
4. 重建分区索引?需要制定分区名称,例如:
alter index PK_DEV_INFO rebuild partition P1 online;