ITPub博客

首页 > Linux操作系统 > Linux操作系统 > merge 用法发练习

merge 用法发练习

原创 Linux操作系统 作者:wuft2003 时间:2011-06-22 16:47:00 0 删除 编辑

---merge
/* 对merge 的使用进行练习,
--
*/
--- 说明
/*merge 用来从一个表中选择一些数据跟新或者插入到另一个表中。
语法:
MERGE [hint] INTO [schema .] table [t_alias] USING [schema .]

{ table | view | subquery } [t_alias] ON ( condition )

WHEN MATCHED THEN merge_update_clause

WHEN NOT MATCHED THEN merge_insert_clause;
在Oracle 10g中MERGE有如下一些改进:

1、UPDATE或INSERT子句是可选的

2、UPDATE和INSERT子句可以加WHERE子句

3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表

4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行

*/
--- create exam tables
create table tb_products
(
 product_id integer,
 product_name varchar2(60),
 category varchar2(60)
 );
  truncate table tb_products
 insert into tb_products values(1501,'VIVITAR 35MM','ELECTRANCS');
 insert into tb_products values(1502, 'OLYMPUS IS50','ELECTRANCS');
 insert into tb_products values(1600, 'PLAY GYM','TOYS');
 insert into tb_products values(1601, 'LAMAZE','TOYS');
 insert into tb_products values(1666, 'HARRY POTTER','D');
COMMIT;
  
  create table tb_newproducts
  (
   product_id integer,
   product_name varchar2(60),
   category varchar2(60)
   );
  
   insert into tb_newproducts values(1502,'OLYMPUS CAMERA','ELECTRACS');
   insert into tb_newproducts values(1601,'LAMAZE','TOYS');
   insert into tb_newproducts values(1666,'HARRY POTTER','TOYS');
   insert into tb_newproducts values(1700,'WAIT INTERFACE','BOOKS');
   COMMIT;
  
1.可以省略update或insert子句
9i中必须指定update和insert,但在10g中可以省略。
merge into tb_products p
using tb_newproducts np
on (p.product_id = np.product_id)
when matched then
update
set p.product_name = np.product_name,p.category = np.category;

  
select * from tb_products
   rollback;
  
在上面例子中, MERGE语句影响到是产品id为1502 1601和1666的行.
它们的产品名字和种 类被更新为表newproducts中的值.

merge into tb_products p
using tb_newproducts np
on (p.product_id = np.product_id)
when not matched then
insert values(np.product_id, np.product_name, np.category)
 
  
   select * from tb_products
2. 添加where 条件
merge into tb_products p
using tb_newproducts np
on (p.product_id = np.product_id)
when matched then
update
set p.product_name = np.product_name,p.category = np.category
where p.category = 'DVD';
 
 
merge into tb_products p
using tb_newproducts np
on (p.product_id = np.product_id)
when not matched then
insert
values(np.product_id,np.product_name,np.category)
where np.category = 'BOOKS';

  
  
---- 也可以合并起来
merge into tb_products p
using tb_newproducts np
on (p.product_id = np.product_id)
when matched then
update
set p.product_name = np.product_name,p.category = np.category
where p.category = 'DVD'
when not matched then
insert
values(np.product_id,np.product_name,np.category)
where np.category = 'BOOKS';

--- ON 条件中是用常量过滤谓词,实现无条件插入
merge into tb_products p
using tb_newproducts np
on( 1 = 0)
when not matched then
  insert values(np.product_id,np.product_name,np.category)
  where np.category = 'BOOKS';
   
  
 ---新增delete 语句 
  10g 中的merge在执行数据操作时清除的选项,你能够在when matched then update子句中包含
  delete 子句。 delete 子句必须有一个where条件来匹配要删除的行。
  匹配delete where 条件但不匹配on条件的行将不会从表中删除。
  
  
merge into tb_products p
using tb_newproducts np
on (p.product_id =np.product_id)
WHEN matched then
  update
  set p.product_name = np.product_name, p.category = np.category
  delete where (p.category = 'ELECTRNCS')
WHEN not matched then
  insert
  values (np.product_id,np.product_name,np.category)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21634752/viewspace-700502/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 小童呓语:杂谈
下一篇: 管理var 目录
请登录后发表评论 登录
全部评论

注册时间:2009-05-12

  • 博文量
    295
  • 访问量
    343352