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

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

[每日一题]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] [email protected]> create table dept60_bonuses 2 (employee_id number 3 ,bonus_amt number); Table created. 2、插入记录 [html] [email protected]> insert into dept60_bonuses values (103, 0); 1 row created. [email protected]> insert into dept60_bonuses values (104, 100); 1 row created. [email protected]> insert into dept60_bonuses values (105, 0); 1 row created. [email protected]> commit; Commit complete. 3、查询60号部门的员工表和奖金表 [html] [email protected]> 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 [email protected]> select * from dept60_bonuses; EMPLOYEE_ID BONUS_AMT ----------- ---------- 103 0 104 100 105 0 4.使用MERGE [html] [email protected]> 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] [email protected]> select * from dept60_bonuses; EMPLOYEE_ID BONUS_AMT ----------- ---------- 104 100 105 960 106 480 106 420 6、回滚 [html] [email protected]> rollback; Rollback complete.

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

(1)插入了两行(员工ID106和107)

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

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

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

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

分类:默认分类 时间:2013-08-10 人气:3
本文关键词:
分享到:

相关文章

  • [每日一题] OCP1z0-047 :2013-08-28 DELETE 2012-01-02

    [每日一题] OCP1z0-047 :2013-08-28 DELETE 正确答案:ACD 根据题库,操作如下:   A答案能删除: [html] [email protected]> delete from order_items 2 WHERE order_id IN (SELECT order_id FROM orders 3 WHERE order_status IN(0,1)); 110 rows deleted. [email protected]> rollback; Rollback complete. B答案

  • [每日一题] OCP1z0-047 :2013-07-28多表插入??pivoting insert(旋转插入) 2012-01-10

    [每日一题] OCP1z0-047 :2013-07-28多表插入??pivoting insert(旋转插入) 这道题目的知识点是要了解Oracle 中的Insert用法 A、pivoting insert(旋转插入) 1、创建表marks_details [html] [email protected]> create table marks_details ( 2 student_id number(4) not null, 3 subject_id1 number(2), 4 marks_englis

  • [每日一题]OCP1z0-047 :2013-08-17 EXTERNAL TABLE??加载数据 2012-01-17

    [每日一题]OCP1z0-047 :2013-08-17 EXTERNAL TABLE??加载数据 正确答案:C 一、对答案解释: A、 TYPE:有两个选可供选择: 1、 ORACLE_LOADER:传统方式,与SQLLDR一样,参数从多,应用较多。 2、 ORACLE_DATADUMP:数据泵(Datapump),这是10gR2中新增的数据访问方式,这种方式的数据源是专用二进制文件,这种二进制文件就目前而言只能用外部表生成,也中能用外部表加载。如果你对Oracle内部格式理解的深入,并有高超

  • [每日一题] OCP1z0-047 :2013-07-16主键与唯一索引 2012-01-30

    [每日一题] OCP1z0-047 :2013-07-16主键与唯一索引 主键包括非空和唯一约束,它会自动创建唯一索引(注:唯一约束也会自动创建唯一索引),测试如下: 1、 创建一个表products [email protected]> Create table products( 2 product_id number(6) constraintprod_id_pk PRIMARY KEY, 3 product_name varchar2(15) 4 ); Table created. 2、 查表prod

  • [每日一题] OCP1z0-047 :2013-08-29 NULL 2012-02-09

    [每日一题] OCP1z0-047 :2013-08-29 NULL 正确答案:B 用函数可以针对各种数据类型时行操作,包括NULL值在内。其中有一类通用函数,是专门针对NULL值的。 1、针对NULL值的通用函数 (1)NVL(表达式1,表达式2): 转换空值为一个实际值。如果表达式1值为空,NVL将返回表达式2的值作为结果。如果表达式1 不为空,以表达式1的值作为结果。 这个函数在有些时候非常有用,在很多应用程序中,都要把空当作0处理,这利用NVL是容易实现的: [html] [email protected]

  • [每日一题] OCP1z0-047 :2013-07-22 group by子句 2012-02-20

    [每日一题] OCP1z0-047 :2013-07-22 group by子句 这道题就是考where group by having的顺序。。。 答案A不正确:where应该放在group by前面 答案B不正确:having子句是用多行函数(sum,avg,max,min,count)等做为条件 答案C不正确:where应该放在group by前面 参考如下:(其实having 也可以放在group by前面) SELECT column, group_function FROM tabl

  • [每日一题] OCP1z0-047 :2013-08-08相关子查询中EXISTS的使用 2012-02-27

    [每日一题] OCP1z0-047 :2013-08-08相关子查询中EXISTS的使用 正确答案是:AC EXISTS谓词非常简单,它是对一个非空集的测试。如果在其子查询中存在任何行,则返回TRUE,否则为FALSE。该谓词不会返回UNKNOWN结果。EXIST()谓词语法如下: <EXISTS谓词>::=[NOTEXISTS]<表子查询> 对exists的测试,看执行计划: [html] [email protected]> create table t3(id number,n

  • [每日一题] OCP1z0-047 :2013-07-31扩展GROUP BY分组??ROLLUP 2012-03-05

    [每日一题] OCP1z0-047 :2013-07-31扩展GROUP BY分组??ROLLUP 我们都知道group by能用来分组的子句;扩展了的group by加上rollup子句,就能为每一个分组返回一条小计录,并为全部分组返回总记录,操作如下: [html] [email protected]> WITH t AS 2 (SELECT 'A' comp,'x' cate,'o' oth,100 fee FROM dual UNION ALL 3 SELECT 'A' comp,'y' cate,'

  • [每日一题] OCP1z0-047 :2013-08-22 正则表达式---[^Ale|ax.r$]' 2012-04-10

    [每日一题] OCP1z0-047 :2013-08-22 正则表达式---[^Ale|ax.r$]' 正确答案:DE 一、Oracle正则表达式的相关知识点 '[^Ale|ax.r$]': ^:匹配行的开始字符 $:匹配行的结束字符 []:方括号表示指定一个匹配列表,该列表匹配列表中显示的任何表达式。 [^]:同上面相反,非匹配列表表达工。 .:匹配任意一个字符(除了NULL) |:替换元字符;结束第一个选项并开始下一个替换表达式 [^Ale|ax.r$]'中^表示只匹配不在集合{'A','l

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.049 (s). 10 q(s)