Oracle学习笔记2

·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) 后面的UpdateInsert 是简化了的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的分区表的索引、表空间 都有globallocal之分。

全局索引就是说索引段是一个;

本地索引它的索引段与分区段是一一对应的.

有多少个分区段,就有多少个索引段,

 

 

3. 分区的优势?

  1) 可以在查询时指定分区以大量提高速度,例如:select * from dinya_test partition(part_01);

  2) 如果没有指定分区而全部遍历分区时,也可以提高查询的速度。

 

4. 重建分区索引?需要制定分区名称,例如:

alter index PK_DEV_INFO rebuild partition P1 online;

 

    

你可能感兴趣的:(oracle,sql)