[每日一题] OCP1z0-047 :2013-08-16 merge的用法....................................................45

转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/10010395



正确答案:A(作为条件判断字段是不能被更新的

Bmisplaced(错位),INSERT写法是对的,并没有错位。

CWHERE子句可以放在INSERT后面做为条件。

D:视图可以做为数据源(真正的数据来自于视图所对应的表)。

 MERGE语句具有按条件获取要更新或插入到表中的数据行,然后从1个或多个源头对表进行更新或者向表中插入行两方面的能力。它最经常被用在数据仓库中来移动大量的数据,但它的应用不仅限于数据仓库环境下。这个语句提供的一个很大的附加值在于你可以很方便地把多个操作结合成一个。这就使你可以避免使用多个INSERTUPDATEDELETE语句。

MERGE语句的语法是:

MERGE <hit>

INTO <table_name>

USING<table_view_or_query>

ON (<condition>)

WHEN MATCHED THEN<update_clause>

DELETE <where_clause>

WHEN NOT MATCHED THEN <insert_clause>

[LOG ERRORS <log_errors_clause> reject limit <integer|unlimited>];

 

为了说明MERGE语句的用法,我们做个测试:

1、创建表

gyj@MYDB> create table dept60_bonuses
  2  (employee_id number
  3  ,bonus_amt number);

Table created.

2、插入记录

gyj@MYDB> insert into dept60_bonuses values (103, 0);

1 row created.

gyj@MYDB> insert into dept60_bonuses values (104, 100);

1 row created.

gyj@MYDB> insert into dept60_bonuses values (105, 0);

1 row created.

gyj@MYDB> commit;

Commit complete.

3、查询60号部门的员工表和奖金表

gyj@MYDB> select employee_id, last_name, salary
  2  from hr.employees
  3  where department_id = 60 ;

EMPLOYEE_ID LAST_NAME                     SALARY
----------- ------------------------- ----------
        103 Hunold                          9000
        104 Ernst                           6000
        105 Austin                          4800
        106 Pataballa                       4800
        107 Lorentz                         4200

gyj@MYDB> select * from dept60_bonuses;

EMPLOYEE_ID  BONUS_AMT
----------- ----------
        103          0
        104        100
        105	    0

4.使用MERGE

gyj@MYDB> merge into dept60_bonuses b
  2  using (
  3  select employee_id, salary, department_id
  4  from hr.employees
  5  where department_id = 60) e
  6  on (b.employee_id = e.employee_id)
  7  when matched then
  8  update set b.bonus_amt = e.salary * 0.2
  9  where b.bonus_amt = 0
 10  delete where (e.salary > 7500)
 11  when not matched then
 12  insert (b.employee_id, b.bonus_amt)
 13  values (e.employee_id, e.salary * 0.1)
 14  where (e.salary < 7500);

4 rows merged.

5、再查奖金表

gyj@MYDB> select * from dept60_bonuses;

EMPLOYEE_ID  BONUS_AMT
----------- ----------
        104        100
        105        960
        106        480
        106	   420

6、回滚

gyj@MYDB> rollback;

Rollback complete.


7MERGE语句完成了下面的这些事情:

1)插入了两行(员工ID106107

(2)更新了一行(员工ID105

(3)删除了一行(员工ID103)

4)一行保持不变(员工ID104

如果没有MERGE语句,你必须最少写3条不同的语句来完成同样的事情。

 

 

官方文档语法:





QQ:252803295

学习交流QQ群:
DSI&Core Search  Ⅰ 群:127149411(技术:已满)
DSI&Core Search  Ⅱ 群:177089463(技术:未满)
DSI&Core Search  Ⅲ 群:284596437(技术:未满)
DSI&Core Search  Ⅳ 群:192136702(技术:未满)
DSI&Core Search  Ⅴ 群:285030382(闲聊:未满)



MAIL:oracledba_cn@hotmail.com

BLOG: http://blog.csdn.net/guoyjoe

WEIBO:http://weibo.com/guoyJoe0218

ITPUB: http://www.itpub.net/space-uid-28460966.html

OCM:   http://education.oracle.com/education/otn/YGuo.HTM


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值