您的位置:首页 > 数据库 > Oracle

Oracle SQL:insert into语句总结 vs merge into用法总结

2015-03-27 16:33 501 查看


insert into语句总结vs merge into用法总结

insert SQL用途:

1、为表插入单行数据

2、也可以通过子查询将一张表的多行数据插入到另外一张表里面

3、同时为多张表插入数据



语法:

INSERT INTO <TABLE> [(colum[,column.....])]VALUES (values[,value....])

table: 指定表或视图

column:指定列名,多列之间用,分开

value: 指定待插入的数据,多值之间依,分开



注意事项:

①.INSERT时既可以指定列,也可以不指定列表

如果不指定列表,则values子句必须为table中的每个列提供数据,且数据顺序与列顺序相同

如果 指定列表,提供的数据的顺序需与相应列对应

②.数字列可之间写入,字符列或日期列插入数据时必须使用单引号引住

③.插入数据必须满足约束规则,主键列和NOT NULL列必须提供数据值

④.插入的数据必须与列的个数及顺序保持一致



insert into应用实例:

基础应用

--新增一个部门:提供列
insert into gem_file(gem01,gem02,gem03,gem07,gem05,gemacti)
      values('2BSB','文青部','文艺青年部','M','Y','Y');
--新增一个部门:不提供列名,则需为table中的每列提供数据,即使为NULL也要提供
insert into gem_file 
      values('2BNB','文青部','文艺青年部',DEFAULT,'Y','','M',DEFAULT,'Y','terry','','','','','');
                                 --可以使用 DEFAULT 提供默认值,如果没有设置默认值则此列数据为NULL


使用子查询插入数据

①.当使用VALUES子句插入数据时,一次只能够插入一行数据

②.还可以将一张表的数据赋值到另外一张表中,方便处理数据表的迁移复制及装载

语法:INSERT INTO <TABLE> [(column[,column],.....)] subQuery

注意:insert列的数据个数必须和subQuery子查询的列的个数及数据类型完全匹配

--将sstl_ft该用户azi_file表中有效的币别档信息复制到sstl_dx用户同表中
     insert into sstl_dx.azi_file
            select * from sstl_ft.azi_file where aziacti = 'Y';
--将sstl_ft该用户azi_file表中有效的币别档信息复制到sstl_dx用户同表中
--采用APPEND直接装载
     insert /*+APPEND */ into sstl_dx.azi_file   -- /*+APPEND */ 直接装载
            select * from sstl_ft.azi_file where aziacti = 'Y';
     --上面两条SQL结果的效果是一样的,但是后面一条使用的直接装载当大批量数据时,直接装载速度远远优于普通的insert


使用多表插入数据( oracle 9i后的功能 )

语法:INSERT ALL insert_into_clause [value_clause] subquery;

INSERT condition_insert_clause sunquery;

说明:insert_into_clause: 指定insert 子句

value_clause: 指定值子句

subquery: 提供数据的子查询

condition_insert_clause:insert条件子句

--使用ALL关键字将总公司的AR单依来源分别复制到子公司AR单
insert ALL
       WHEN oma66='SSTL_DX' THEN INTO sstl_dx.oma_file
       WHEN oma66='SSTL_ZK' THEN INTO sstl_zk.oma_file
       WHEN oma66='SSTL_FT' THEN INTO sstl_ft.oma_file
  SELECT * from sstl.oma_file where omaacti = 'Y';

--使用FIRST关键字将总公司的AR单依来源分别复制到子公司AR单
--如果数据已经满足了先前条件并且已经被插入到某表,那么该行数据在后续插入将不会被再次使用
--主要应用于WHEN后面的条件判断交叉时做条件管控
insert FIRST
       WHEN oma66='SSTL_DX' THEN INTO sstl_dx.oma_file
       WHEN oma66='SSTL_ZK' THEN INTO sstl_zk.oma_file
       WHEN oma66='SSTL_FT' THEN INTO sstl_ft.oma_file
   SELECT * from sstl.oma_file where omaacti = 'Y';


merge into应用:实现 无则insert插入,有则update更新,一条语句直接进行insert/update操作

merge ino语法:

MERGE INTO table1 alias1

USING (table2|view2|sub_query2) alias2

ON (join condition)

WHEN MATCHED THEN

UPDATE table1

SET col1 = col_val1,

col2 = col2_val

WHEN NOT MATCHED THEN

INSERT (column_list)
VALUES (column_values);

--将总公司sstl的客户信息occ_file数据表和子公司sstl_dx的客户信息occ_file核对
--如果sstl_dx公司的客户信息和sstl不同,则依据sstl客户信息更新sstl_dx的客户信息
--如果sstl_dx公司没有,则将sstl的客户信息新增入sstl_dx公司
    MERGE INTO sstl_dx.occ_file dx_occ
          USING sstl.occ_file sstl_occ
          ON(dx_occ.occ01 = sstl_occ.occ01)
        WHEN MATCHED THEN
          update
            set dx_occ.occ02 = sstl_occ.occ02,
                dx_occ.occ03 = sstl_occ.occ03,
                dx_occ.occ04 = sstl_occ.occ04,
                dx_occ.occ05 = sstl_occ.occ05,
                ...
            where dx_occ.occacti = 'Y'
        WHEN NOT MATCHED THEN
          insert
            values(sstl_occ.occ01,sstl_occ.occ02,sstl_occ.occ03,sstl_occ.occ04,sstl_occ.occ05,...)
            where sstl_occ.occacti = 'Y';


http://blog.csdn.net/yihuiworld
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: