(Les14 Manipulating Large Data Sets)[20171222]

       
-使用DEFAULT选项可以幸免在程序中硬编码缺省值或询问字典以搜寻它。 

    -基于其它一个表的值更新一个表数据

学习目的:

        10:19:14 SQL> insert into (select employee_id,last_name,email,hire_date,job_id from emp
        10:19:14   2  where employee_id=102 with check option)
        10:19:14   3  values(101,'Kochhar','NKOCHHAR',to_date('1989-09-21','YYYY-MM-DD'), 'HD_VP');
        insert into (select employee_id,last_name,email,hire_date,job_id from emp   

        ERROR 在行 1:
        ORA-01402: 檢視 WITH CHECK OPTION where- 子句違反

        10:18:38 SQL> insert into (select employee_id,last_name,email,hire_date,job_id from emp
        10:18:38   2  where employee_id=101 with check option)
        10:18:38   3  values(101,'Kochhar','NKOCHHAR',to_date('1989-09-21','YYYY-MM-DD'), 'HD_VP');
        已建立 1 個資料列.

        

           
condition_into_clause按规范执行多INSERT。Oracle通过相应的WHEN条件过滤每个insert_into_clause。一个多INSERT语句最多可以包括127个WHEN子句。

    旋转INSERT(行转列)

    -使用子查询操纵数据

 

        好处:

           
Oracle评估每个WHEN子句,而不考虑任何WHEN子句的结果,对规格为确实每个WEHN子句,执行相应的INTO子句。

        注意:子查询中只可以回到一个值不可能是一个会晤。

          

        多表INSERT语句是已毕SQL数据转换的技艺之一。

 向子查询插入数据

 UPDATE <object_table> 
    SET COLUMN = (subquery1),
       SET COLUMN = (subquery2)
            WHERE <conditional>;

        -SCN(System Change
Number)系统更改号,Oracle分配一个系统更改号(SCN),以标识每个提交业务的重做记录。

           
-提取,必须从很多不比的根源(如数据库、应用程序)中分辨和领取所属的多少。

        多表INSERT限制操作

 

 

        有条件INSERT ELSE

            -加载,将数据存放于数据库。

        21:56:28 SQL> update emp set salary=1000 where employee_id=101;
        已更新 1 個資料列.
        21:57:01 SQL> commit;
        確認完成.
        21:57:04 SQL> update emp set salary=salary+1000 where employee_id=101;
        已更新 1 個資料列.
        21:57:11 SQL> commit;
        確認完成.
        21:57:13 SQL> select salary from emp
        21:57:20   2  versions between scn minvalue and maxvalue
        21:57:21   3  where employee_id=101;
        SALARY
        ----------
         2000
         1000

    21:57:22 SQL> select versions_starttime,versions_endtime ,salary from emp
    21:59:06   2  versions between scn minvalue and maxvalue
    21:59:09   3  where employee_id=101;


VERSIONS_STARTTIME                  VERSIONS_ENDTIME                        SALARY
----------------------------------- ----------------------------------- ----------
22-12月-17 09.57.10 下午                                                     2000
22-12月-17 09.57.01 下午            22-12月-17 09.57.10 下午                  1000
22-12月-17 09.56.16 下午            22-12月-17 09.57.01 下午                  2000
22-12月-17 09.55.58 下午            22-12月-17 09.56.16 下午                  1000
                                   22-12月-17 09.55.58 下午    
     INSERT FIRST
                WHEN <conditional> THEN
                    INTO <table_name> VALUES(...,...,...)
                WHEN <conditional> THEN
                    INTO <table_name> VALUES(...,...,...)
                ELSE
                    INTO <table_name> VALUES(...,...,...)
                (subquery);

 突显默许值

使用子查询操纵数据

    基于子查询更新数据

            -不可能远程表(dblink)执行多INSERT

       
能够利用闪回版本查询在一段时间内查看行的具有变更。此意义可以将一个版本子句附加到SELECT
语句,该语句指定查看行值更改的SCN或时刻戳范围。

        -有条件 FIRST INSERT

       
从源库提取数据并将其引入数据仓库的长河一般号称ETL,它代表提取、转换和加载。

        语法

        INSERT ALL
                    INTO <table_a> VALUES (...,...,...)
                    INTO <table_b> VALUES (...,...,...)
                    INTO <table_c> VALUES (...,...,...)
                    SELECT ...
                    FROM <source_table>
                    WHERE <conditional>;

        

            -减少INSERT … SELECT语句

           
Oracle按梯次评估每个WHEN子句。如果第四个WHEN子句的乘除结果为true,则Oracle执行相应的INTO子句并跳出后续WHEN子句。

        有条件INSERT FIRST

        注意:VALUES输入值栏位必须同子查询相匹配,表中NOT
NULL栏位必须含有在子查询中,坚守基表任何规则。

           
ALL前边跟四个insert_into_clause来举办无条件的多项INSERT。子查询每再次来到一行均举办四次insert_into_clause。

        -有条件 FIRST INSERT

       
-在INSERT和UPDATE语句中行使DEFAULT关键字来识别默许值,要是不存在默许值则使用NULL空值。

            -多表INSERT时不能采取表集合表达式,如TABLE1,TABLE2..

            -减少转换工作量

       
多表插入,从子查询再次来到的行通过统计插入到一个或多个表中。多表INSERT语句在数据仓库非凡有用,定期加载数据到数据仓库,以便于工作分析。

        -旋转INSERT

           
-转换,数据必须物理运输到对象连串或中等系统开展更为处理,在此进程中得以进行部分更换。

        -知足条件存在就UPDATE、不设有就INSERT

    -跟踪数据生命周期内的转移

 

        

    多表插入

        指定WITH CHECK
OPTION,纵然在INSERT,UPDATE或DELETE语句中使用子查询来替代表中的某个表,那么不会操作未包括在子查询中的行的改动。简而言之必须知足条件的行才能INSERT、UPDATE和DELETE。

        -有条件 ALL INSERT

 内联视图作为源取回数据

           
-多表INSERT中,所有insert_into_clause组合不可能领先999个目的列。

      INSERT ALL
                INTO <table_name> VALUES(...,...,...)
                INTO <table_name> VALUES(...,...,...)
                (subquery WHERE <conditional>);
INSERT INTO <table_name> [ column (, column ) ] subquery;

       –
MERGE语句适用于广大数据仓库应用程序。例如,在数据仓库应用程序中,能够必要处理三个源的多少,其中部分多少可能是再度的,通过MERGE语句,可以有规范地增加或修改行。

    

     INSERT ALL
                WHEN <conditional> THEN
                    INTO <table_name> VALUES(...,...,...)
                WHEN <conditional> THEN
                    INTO <table_name> VALUES(...,...,...)
                (subquery);

    -基于其余一个表的值删除一个表数据

 INSERT INTO ( subquery ) VALUES(col_value,....);

        

        有条件INSERT ALL

    子查询DML数据利用WITH CHECK OPTION        

    -从此外一个表复制数据

    -从内联视图取回数据

    MERGE语句

       INSERT [ALL] [conditional_insert_clause] [insert_into_clause values_clause] (subquery)
            -conditional_insert_clause
                [ALL] [FIRST]
                [WHEN condition THEN] [insert_into_clause values_clause] [ELSE] [insert_into_clause values_clause]

    从子查询复制数据

       INSERT ALL
                   INTO <table_name> VALUES(col1,col2,col3)
                   INTO <table_name> VALUES(col1,col2,col4)
                   INTO <table_name> VALUES(col1,col2,col5)
            SELECT col1,col2,col3,col4,col5 FROM <table_name> WHERE <conditional>;

 

       

        -undo_retention开首化参数,保留版本的时光值。

           
Oracle按顺序评估每个WHEN子句。若是WHEN没有满意的则执行ELSE中的INTO,再则ELSE也不满意,则Oracle不会对该行利用其余操作。 
 

    多表INSERT类型

    子查询可用以从表中检索数据,您可以将其当做INSERT的输入到不一样的表中。
那样,您可以利用一个SELECT语句轻松地将大量数额从一个表复制到另一个表。
同样,可以使用子查询在UPDATE和DELETE语句的WHERE子句中使用子查询进行批量创新和删除。
您也足以在SELECT语句的FROM子句中使用子查询。 那被称之为内联视图。

        -旋转INSERT

*    versions_starttime和versions_endtime伪列*

  MERGE INTO <object_table> USING <source_table> ON (join column)
            WHEN MATCHED THEN
                UPDATE SET ...
            WHEN NOT MATCHED THEN
                INSRT (column_list) VALUES...;->注意这里没有INTO 关键字。

        语法:

       –
Oracle协助INSERT、UPDATE和DELETE操作的联结语句。防止了八个DML语句。是不是INSERT、UPDATE或DELELE到目的表取决于子句中的条件。

        有条件INSERT

 

    -使用多表插入

    基于另一个表删除数据

DELETE FROM <object_table> WHERE COLUMN = (SELECT COLUMN FROM <source_table> WHERE <conditional>);

        -有条件ALL INSERT

        -无条件INSERT

        -无条件INSERT

            -不可能在视图或物化视图上举办

    跟踪数据的改观

    -显示多表插入特性

      10:24:56 SQL> update emp set job_id=default where employee_id=101;
        update emp set job_id=default where employee_id=101
                       *
        ERROR 在行 1:
        ORA-01407: 無法將 ("HR"."EMP"."JOB_ID") 更新為 NULL

        10:26:25 SQL> select salary from emp where employee_id=101;
        SALARY
        ----------
         16990
        10:26:48 SQL> update emp set  salary=default where employee_id=101;
        已更新 1 個資料列.
        10:27:11 SQL> select salary from emp where employee_id=101;
        SALARY
        ----------

        无条件INSERT

        

    -合并表行

SELECT    a.column [ ( , a.column ) , b.column ( , b.column ) ] FROM  <table_name > a JOIN  ( subquery ) b         ON a.column= b.column;
 INSERT INTO ( subquery <conditional> WITH CHECK OPTION ) VALUES(col_value,....);

            -新语句并行化升高性能

 

相关文章