[每日一题]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条不同的语句来完成同样的事情。