当前位置:编程问答 > Unix/Linux >

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

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

 
正确答案:A(作为条件判断字段是不能被更新的)
B:misplaced(错位),INSERT写法是对的,并没有错位。
C:WHERE子句可以放在INSERT后面做为条件。
D:视图可以做为数据源(真正的数据来自于视图所对应的表)。
 MERGE语句具有按条件获取要更新或插入到表中的数据行,然后从1个或多个源头对表进行更新或者向表中插入行两方面的能力。它最经常被用在数据仓库中来移动大量的数据,但它的应用不仅限于数据仓库环境下。这个语句提供的一个很大的附加值在于你可以很方便地把多个操作结合成一个。这就使你可以避免使用多个INSERT、UPDATE及DELETE语句。
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、创建表
[html] 
gyj@MYDB> create table dept60_bonuses  
  2  (employee_id number  
  3  ,bonus_amt number);  
  
Table created.  

2、插入记录
[html] 
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号部门的员工表和奖金表
[html] 
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
[html] 
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、再查奖金表
[html] 
gyj@MYDB> select * from dept60_bonuses;  
  
EMPLOYEE_ID  BONUS_AMT  
----------- ----------  
        104        100  
        105        960  
        106        480  
        106    420  

6、回滚
[html] 
gyj@MYDB> rollback;  
  
Rollback complete.  

 

 
7、MERGE语句完成了下面的这些事情:
(1)插入了两行(员工ID106和107)
(2)更新了一行(员工ID105)
(3)删除了一行(员工ID103)
(4)一行保持不变(员工ID104)
如果没有MERGE语句,你必须最少写3条不同的语句来完成同样的事情。
 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,