MERGE INTO用法

作用:一条SQL语句从一个或多个数据源中完成对表的更新或插入数据,例如现在两张表,两张表都有bsm,通过merge into可以把bsm一样的一张表里的数据复制到另外一张表中。可同时进行INSERT和UPDATE操作,为DML语句,需要COMMIT或ROLLBACK提交回滚事务。
用法:9i引入,使用此命令时需要同时指定UPDATE和INSERT关键词
      10g改动
      1、UPDATE和INSERT子句都是可选用的
      2、UPDATE和INSERT子句可以加WHERE子句
      3、在ON条件中可以使用常量过滤谓词来INSERT所有行到目标表,不需要连接主表和目标表
      4、UPDATE子句后面可以跟DELETE子句删除一些不需要的行
语法:
      MERGE INTO [your table-name] [rename your table here] 
           USING ( [write your query here] )[rename your query-sql and using just like a table] 
           ON ([conditional expression here] AND [...]...) 
           WHEN MATHED THEN [here you can execute some update sql or something else ] 
           WHEN NOT MATHED THEN [execute something else here ] 
实例:
 CREATE TABLE sourcetab(   
    ID INTEGER,   
    NAME VARCHAR2(60),   
    INFO VARCHAR2(60)   
 );   
  
INSERT INTO sourcetab VALUES(1501, 'VIVITAR 35MM', 'ELECTRNCS');   
INSERT INTO sourcetab VALUES(1502, 'OLYMPUS IS50', 'ELECTRNCS');   
INSERT INTO sourcetab VALUES(1600, 'PLAY GYM', 'TOYS');   
INSERT INTO sourcetab VALUES(1601, 'LAMAZE', 'TOYS');   
INSERT INTO sourcetab VALUES(1666, 'HARRY POTTER', 'DVD');   
COMMIT;   
  
 CREATE TABLE desttab(   
    ID INTEGER,   
    NAME VARCHAR2(60),   
    USEAGE VARCHAR2(60)   
 );   
  
INSERT INTO desttab VALUES(1502, 'OLYMPUS CAMERA', 'ELECTRNCS');   
INSERT INTO desttab VALUES(1601, 'LAMAZE', 'TOYS');   
INSERT INTO desttab VALUES(1666, 'HARRY POTTER', 'TOYS');   
INSERT INTO desttab VALUES(1700, 'WAIT INTERFACE', 'BOOKS');   
COMMIT;   

MERGE INTO desttab d USING sourcetab s|(SELECT * FROM sourcetab) s  --USING后可使用子查询或视图
ON (d.ID=s.ID)      --匹配条件
WHEN MATCHED THEN 
UPDATE SET d.name=s.name,d.info=s.info
WHEN NOT MATCHED THEN
INSERT (d.id,d.name,d.info)  VALUES(s.id,s.name,s.info);

下面查看一下10g新特性
1、UPDATE和INSERT子句都是可选用的
比较容易理解,可省略matched或not matched子句

2、UPDATE和INSERT子句可以加WHERE子句
MERGE INTO desttab d USING sourcetab s
ON (d.ID=s.ID)      
WHEN MATCHED THEN 
UPDATE SET d.name=s.name,d.info=s.info
WHERE s.info= 'TOYS'   --匹配后只更新源表名字为TOYS的记录
WHEN NOT MATCHED THEN
INSERT (d.id,d.name,d.info)  VALUES(s.id,s.name,s.info)
WHERE s.info='TOYS';   --不匹配后只更新源表名字为TOYS的记录

3、在ON条件中可以使用常量过滤谓词来INSERT所有行到目标表,不需要连接主表和目标表
MERGE INTO desttab d USING sourcetab s
ON (1=0)  --肯定不匹配,只插入 直接INSERT INTO会更简单
WHEN MATCHED THEN 
UPDATE SET d.name=s.name,d.info=s.info
WHEN NOT MATCHED THEN
INSERT (d.id,d.name,d.info)  VALUES(s.id,s.name,s.info);

4、UPDATE子句后面可以跟DELETE子句删除一些不需要的行
MERGE INTO desttab d USING sourcetab s
ON (d.ID=s.ID)      
WHEN MATCHED THEN 
UPDATE SET d.name=s.name,d.info=s.info
DELETE WHERE s.info= 'TOYS'   --匹配后只删除目标表信息为TOYS的记录DELETE d WHERE d.id=s.id AND s.info='TOYS'
WHEN NOT MATCHED THEN
INSERT (d.id,d.name,d.info) VALUES(s.id,s.name,s.info);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值