说明:已经有了一个帖子,http://www.itpub.net/thread-1780629-1-1.html ,但是感觉和这个要求不完全一样,所以再来问问大家啊;
create table t_sell(商品编号 varchar2(20), bs_flag varchar2(2), 姓名 varchar2(20), 数量 number , 卖方序号 number);
insert into t_sell values('A01', 'S', '张三' , 5, 1);
insert into t_sell values('A01', 'S', '李四' , 12, 2);
insert into t_sell values('A01', 'S', '王五' , 5, 3);
insert into t_sell values('A01', 'S', '赵六' , 5, 4);
create table t_buy(商品编号 varchar2(20), bs_flag varchar2(2), 姓名 varchar2(20), 数量 number , 买方序号 number);
insert into t_buy values('A01', 'B', 'TOM' , 10, 1);
insert into t_buy values('A01', 'B', 'MIKE' , 20, 2);
insert into t_buy values('A01', 'B', 'JOHN' , 30, 3);
insert into t_buy values('A01', 'B', 'SAM' , 40, 4);
t_sell表存放全部的卖出情况,t_buy表存放全部的买入情况。
对于t_sell的每一行,到t_buy里去找对应的good_id的情况进行配对(按照 order_number列的顺序),配对后,各自的数量都减少了配对的数量,把这次配对的买卖双方、货物名称、数量记录到另外的表里,
简单算法:
对t_sell 的按order_number排序的结果,对其中每一行,循环
对 t_buy中的每一行,循环
如果t_buy中有和外循环相同的good_id,就找出t_sell的amount、t_buy的amount中的较小值,t_sell和t_buy都减去较小值,
如果外循环t_buy中的amount减少到0,exit,寻找下一个t_sell中的数据
内循环结束
外循环结束
第1次配对, t_sell中的第1个记录、t_buy中的第1个记录进行匹配,t_sell中的第1个记录被配对结束; B/S 都减少了 5;
第2次配对, t_sell中的第2个记录、t_buy中的第1个记录进行匹配,t_buy中的第1个记录被配对结束; B/S 都减少了 5;
第3次配对, t_sell中的第2个记录、t_buy中的第2个记录进行匹配,t_sell中的第2个记录被配对结束; B/S 都减少了 7;
第4次配对, t_sell中的第3个记录、t_buy中的第2个记录进行匹配,t_sell中的第3个记录被配对结束; B/S 都减少了 5;
第5次配对, t_sell中的第4个记录、t_buy中的第2个记录进行匹配,t_sell中的第4个记录被配对结束; B/S 都减少了 5;
此时t_sell已经没有记录了,配对结束;
创建匹配结果表如下:
create table t_result(商品编号 varchar2(20), 卖方姓名 varchar2(20), 买方姓名 varchar2(20), 配对量 number, 卖方序号 varchar2(20), 买方序号 varchar2(20) );
现在需要在t_result表中,插入如下内容:
商品编号 卖方姓名 买方姓名 配对量 卖方序号 买方序号
A01 张三 TOM 5 1 1
A01 张三 TOM 5 2 1
A01 李四 MIKE 7 2 2
A01 王五 MIKE 5 3 2
A01 赵六 MIKE 5 4 2
1,如何写一个SQL语句,给t_result表中,插入上面的内容呢?
2,如果一个SQL语句不能完成,只能写PL/SQL的双重循环了,一个SQL语句、与PL/SQL双重循环,哪个效率高呢?