【SQL】使用insert all + row_number()语法将数据灌装到两个表中


这个是 我 为论坛上一位朋友解决问题的一个回帖,感觉也是挺有意义的一个解决方案,记录一下。

论坛帖子地址: http://www.itpub.net/forum.php?mod=viewthread&tid=1503973&page=1#pid18449834

问题描述:
-------------------------------------------
有三个表 
test1(col1,col2,col3,col4,col5,col6) 数据源表 (col1,col2,col3 用来分类)
test2(col1,col2,col3)                           用于存放 类别 的目标表
test3(col4,col5,col6)                           用于存放 明细 的目标表

需求是,将test1中的数据按照col1,col2,col3来分类,将col1,col2,col3相同的类别数据放入test2表中,将明细数据放入test3中。

其实简单的做法的话是,将test1两次查询,分别将结果放入test2和test3中:
第一次     insert into test2 select disctinct col1,col2,col3 from test1;
第二次     insert into test3 select col4,col5,col6 from test1;

但是考虑到test1可能会很大,两次查询可能会带来一些性能问题,所以我提供了一种利用insert all + row_number()语法,只检索一次test1表,将结果分别灌入test2,test3中。
---------------------------------------

我的回帖:
--------------------------------------------------------
需求大体了解,使用insert all + row_number()语法 应该可以实现。

简单模拟了一下,你看看是不是你想要的效果。

-- 创建测试表
SQL> create table test1 (col1 varchar(5),col2 varchar(5),col3 varchar(5),col4 varchar(5),col5 varchar(5),col6 varchar(5));

Table created

SQL> create table test2 (col1 varchar(5),col2 varchar(5),col3 varchar(5));

Table created

SQL> create table test3 (col4 varchar(5),col5 varchar(5),col6 varchar(5));

Table created

-- 向测试表test1表中插入测试数据
SQL> insert into test1 values('A0001','B0001','C0001','D0001','E0001','F0001');

1 row inserted

SQL> insert into test1 values('A0001','B0001','C0001','D0002','E0002','F0002');

1 row inserted

SQL> insert into test1 values('A0001','B0001','C0001','D0003','E0003','F0003');

1 row inserted

SQL> insert into test1 values('A0004','B0004','C0004','D0004','E0004','F0004');

1 row inserted

SQL> insert into test1 values('A0005','B0005','C0005','D0005','E0005','F0005');

1 row inserted

SQL> commit;

Commit complete

-- 使用insert all 及row_number()语法实现有选择地向test2和test3中插入数据
SQL> 
SQL> insert all
  2  when  (rcnt = 1) then
  3      into test2  (col1, col2, col3) values  (col1, col2, col3)
  4  when  (rcnt is not null) then
  5      into test3  (col4, col5, col6) values  (col4, col5, col6)
  6  select col1,
  7           col2,
  8           col3,
  9           row_number() over(partition by col1, col2, col3 order by col1, col2, col3) rcnt,
10           col4,
11           col5,
12           col6
13  from test1;

8 rows inserted

SQL> commit;

Commit complete

SQL> select * from test1;

COL1  COL2  COL3  COL4  COL5  COL6
----- ----- ----- ----- ----- -----
A0001 B0001 C0001 D0001 E0001 F0001
A0001 B0001 C0001 D0002 E0002 F0002
A0001 B0001 C0001 D0003 E0003 F0003
A0004 B0004 C0004 D0004 E0004 F0004
A0005 B0005 C0005 D0005 E0005 F0005

SQL> select * from test2;

COL1  COL2  COL3
----- ----- -----
A0001 B0001 C0001
A0004 B0004 C0004
A0005 B0005 C0005

SQL> select * from test3;

COL4  COL5  COL6
----- ----- -----
D0001 E0001 F0001
D0002 E0002 F0002
D0003 E0003 F0003
D0004 E0004 F0004
D0005 E0005 F0005

SQL>
-------------------------------------------

以上。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20335819/viewspace-709674/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20335819/viewspace-709674/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值