免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1498 | 回复: 3
打印 上一主题 下一主题

一个感觉有难度的问题,请高手帮忙解决 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-23 10:28 |只看该作者 |倒序浏览
此问题涉及两张表,暂且称A表和B表
A表的数据结构如下
no     icount    flag
1       7        1
1       10       -1
1       20       1
1       25       -1
1       25       1
1       30       -1
1       30       1
其中flag都是按no和icount排序后以1和-1交错出现的

B表的数据结构如下
no   icount
1       11
1       18
1       23    

要求把B表中的icount插入到A表中,如果B表中有icount的大小存在于A表中-1和1之间,则不允许插入
比如说:
在B表中的icount为11的数据由于在A表中存在10,-1和20,1的两条记录,所以不能插入
在B表中的icount为23的数据由于在A表中不存在(<23),-1和(>23),1的两条记录,所以允许插入

得出的最后A表的结果应为:
no     icount    flag
1       7        1
1       10       -1
1       20       1
1       23         (增加了此条记录)
1       25       -1
1       25       1
1       30       -1
1       30       1

不知各位怎么实现以上的功能,请指教。

论坛徽章:
0
2 [报告]
发表于 2006-03-23 11:35 |只看该作者
写个存储过程
开始读b的记录
选出a中小于b.icount的最大记录max(icount)判断flag是否为-1 否的话插入a表,继续读b下一条记录
是的话,选出a中大于b.icount的最小记录min(icount)判断flag是否为1 否的话插入a表,继续读b的下一条记录,
是的话,继续读下一条

论坛徽章:
0
3 [报告]
发表于 2006-03-23 11:36 |只看该作者
create procedure foo
as
declare @icount your_type
declare curor c1 for
select your_columns
  from B
begin
  open c1
  fetch c1 into @icount...
  while (@@sqlstatus = 0)
  begin
    if exists (select 1 from A where icount > @icount and flag = -1) and
       exists (select 1 from A where icount < @icount and flag = 1 )
      insert....
    fetch c1 into @icount...
  end
end

论坛徽章:
0
4 [报告]
发表于 2006-03-23 15:17 |只看该作者
A表和B表都有上百万条的记录,
如果用游标的话就算可以实现上述功能也会很慢,
除了游标,还有没有什么好的办法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP