• 多表insert操作详解


    --1.无条件的多表insert all
    create table emp_1 as select id,last_name from s_emp where 1=0;
    create table emp_2 as select * from s_emp where 1=0;
    create table emp_3 as select * from s_emp where 1=0;
    --没有条件,向多个目标表全量插入,必须有all
    insert all
    --不指定emp_1后面的列,也不指定values,那么emp_1中的所有列类型和顺序与查询的列的类型和顺序一致
    --也就是emp_1中只有查询结果中的那几列,而且类型和顺序与其一致
    into emp_1
    --指定了emp_2后面的列,没有values,表示emp_2中要插入的列被选择出来,与查询的结果列类型和顺序一致
    --emp_2中也可能有很多列,不止这两列
    into emp_2(id,last_name)
    --指定emp_3后面的列,也指定values,那么values后面的列名必须与查询结果一致,如果
    --查询中有别名,必须在values中使用别名。emp_3中指定的列类型和顺序必须与values保持一致
    --emp_3中也可能列数大于指定的列数
    into emp_3(id,last_name) values(s_id,s_last_name)
    select id s_id,last_name s_last_name
      from s_emp;
    
    --2.带条件的多表insert all
    --conditional insert all:all可以省略,但不建议.
    insert all
    --将查询结果中为s_id>20的插入,条件中指定的列必须与查询的结果名字一致,如果有别名,用别名
    when s_id>20 then
    into emp_1
    --s_last_name为M开头的插入,可能插入的行与s_id>20有重复
    when s_last_name like 'M%'then
    into emp_2(id,last_name)
    --如果指定else,则不满足上面两个条件的插入到emp_3,插入的行不会与上面两个重复
    else
    into emp_3(id,last_name) values(s_id,s_last_name)
    select id s_id,last_name s_last_name
      from s_emp;
      
    --3.带条件的多表insert first
    --Insert first只有带条件的,没有不带条件的。
    --语法只要将insert all中的all改为first就可以了。这里的first不可以省略。省略那么默认就是all
    insert first
    --将查询结果中为s_id>20的插入,条件中指定的列必须与查询的结果名字一致,如果有别名,用别名
    when s_id>20 then
    into emp_1
    --s_last_name为M开头的插入,插入的行与s_id>20没有重复
    when s_last_name like 'M%'then
    into emp_2(id,last_name)
    --如果指定else,则不满足上面两个条件的插入到emp_3,插入的行不会与上面两个重复
    else
    into emp_3(id,last_name) values(s_id,s_last_name)
    select id s_id,last_name s_last_name
    from s_emp;
    
    --4.选择插入Pivoting insert
    --使用pivoting insert实现将非关系性表记录转换为关系型表中存储。Pivot旋转是OLAP中的一个基本改变,提供多维度数据分析。
    insert all
    into sales_info values(employee_id,week_id,sales_mon) --分别按每个工作日插入
    into sales_info values(employee_id,week_id,sales_tue)
    into sales_info values(employee_id,week_id,sales_wed)
    into sales_info values(employee_id,week_id,sales_thur)
    into sales_info values(employee_id,week_id,sales_fri)
    select employee_id,week_id,sales_mon,sales_tue,sales_wed,sales_thur,sales_fri
    from sales_source_data;
    
    多表insert使用限制:
    1. 只能对table使用多表insert,不能对视图或物化视图使用。
    2. 不能对远程表进行这个插入操作。
    3. 在做多表insert操作,不能指定一个表的集合表达式。
    4. 多表insert中的的into目标表加在一起的列数不能超过999 个。
  • 相关阅读:
    osip2 代码分析
    批处理命令——call 和 start
    在VS2010 VC++项目中引用Lib静态库(以Openssl为例)
    Gerrit 代码审核服务器的工作流和原理
    crucible VS gerrit
    领导者/追随者(Leader/Followers)模型和半同步/半异步(half-sync/half-async)模型都是常用的客户-服务器编程模型
    半同步半异步I/O的设计模式(half sync/half async)
    高并发系统设计
    通过Nginx反向代理之后客户端验证码session不一致造成无法验证通过的问题解决
    使用Nodpad++正则替换
  • 原文地址:https://www.cnblogs.com/huangbiquan/p/8001763.html
Copyright © 2020-2023  润新知