设为首页 收藏本站
查看: 1094|回复: 0

[经验分享] 【转】pivoting insert

[复制链接]

尚未签到

发表于 2015-6-17 05:55:18 | 显示全部楼层 |阅读模式
  oracle insert语句的扩展
向一个表发散弹枪:
          ⑴ insert into table_name [(column[,column...])] select_statement  每次只能插入一个表,但性能上比写多条insert语句要高。
  另外,oracle还提供create table table_name as select ...,as不可少!实现直接创建并且插入表,依赖于后面的select语句的结果,
  如:create table new_table as select * from source_table where 1=0
  
             案例:
             表mxt新增一列time,那么这个列会被置在最后,现想把此列放于第2



create table copy_mxt as select id,time,name from mxt;
drop table mxt;  
rname copy_mxt to mxt;
  
  向多个表发散弹枪:
类型:
            ① 无条件的insert
            ② 带条件的insert all
            ③ 带条件的insert first
            ④ pivoting insert
  多表insert的使用限制:
            ① 只能对table使用insert,不能对视图或物化视图使用
            ② 不能对远程表使用这个插入操作
            ③ 多表插入时,不能指定一个表的集操作
            ④ 多表insert的into的目标表加在一起的列数不能超过999
          ㈠ 无条件的insert
             语法:
             insert all
             into dest_table1 [column(,column...)] [values (...)]
             into dest_table2 [column(,column...)] [values (...)]
             ...
             select_statement  --values中指定是select结果列,如果没有values指定列,那么表示目标表的列类型和顺序与select语句查询的结果完全一致。建议不要省略目标表中的列和values,增强可读性。
             例子:



create table emp_1 as select employee_id,last_name from employees where 1=0;
create table emp_2 as select * from employees where 1=0;
create table emp_3 as select * from employees where 1=0;
insert all
into emp_1
--不指定emp_1后面的列,也没有values指定列,那么emp_1所有列类型和顺序与查询的列的类型和顺序一致
--也就是emp_1中只有查询结果中的那几列,而且类型和顺序一致
into emp_2(employee_id,last_name)
--指定了emp_2后面的列,但没有values指定列,表示emp_2中要插入的列被选择出来,与查询结果列的类型和顺序一致
--emp_2也有很多列,不止这两列
into emp_3(employee_id,last_name) values(e_id,e_last_name)
--指定emp_3后面的列和values指定列,那么values后面的列名必须与查询结果一致,如果查询有别名,必须在values中使用别名
--emp_3指定的列的类型和顺序必须与values保持一致
--emp_3也可能列数大于指定列数
select employee_id e_id,last_name e_last_name
from employees
  ㈡ 带条件的insert
  包括:insert all和insert first
             语法:
             insert all
             when condition_statement
             then into dest_table1[指定列] values[查询中的列]
             when condition_statement
             then into dest_table2[指定列] values[查询中的列]
             select_statement
             注释:带条件的insert all与insert first的区别在于只按条件对查询的结果进行刷选,不会考虑前面已经匹配过的记录,每次都是全量匹配,
  而insert first对已经匹配过的记录不予考虑,下一个when会自动过滤掉上一个匹配过的行记录
             例子:



insert all  
when e_id>20  
then into emp_1     
--将查询结果s_id>20的插入,条件中指定的列必须与查询结果名字一致,如果有别名,请用别名
when e_last_name like 'M%'  
then into emp_2(employee_id,last_name)   
--s_last_name为M开头的插入,可能插入的行与s_id有重复
else  
into emp_3(employee_id,last_name) values(e_id,e_last_name)  
--如果指定else,则不满足上面条件的插入到emp_3,插入的行不会与上面两个重复
select employee_id e_id,last_name e_last_name  
from employees
  ㈢ pivoting insert(旋转插入)--列转行
  关系型数据库三范式,归纳起来三句话:
             ① 行不可再分
             ② 列不可再分
             ③ 列不可重复
             但很多情况下,范式都会被破坏。使用旋转插入可以实现将非关系表记录转换为关系表在数据库存储。和insert all类似,不过这里是向一个表发散弹枪,将列转变成行。
例子:



create table sales (year_2008 number,year_2009 number,year_2010 number,year_2011 number,year_2012 number)
insert into sales values(191,922,392,942,592)
select * from sales
create table cow_sales(year_sales number)
insert all
into cow_sales values(year_2008)
into cow_sales values(year_2009)
into cow_sales values(year_2010)
into cow_sales values(year_2011)
into cow_sales values(year_2012)
select * from sales
select * from cow_sales
  note that  this 'pivot' technique is different from sql operations that use the key word PIVOT or UNPIVOT. What we've described here is a technique that uses the conditional multitable INSERT to pivot data.
  the keyword PIVOT, while somewhat similar in function, is a  separate feature and not discussed here, nor is it listed in the exam certification objectives.
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-77990-1-1.html 上篇帖子: OCP读书笔记(6) 下篇帖子: OCP读书笔记(17)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表