zhypp 2015-08-30 12:38 采纳率: 0%
浏览 1230

SQL2000 单表递归难题

有一对应表,就两个字段:订单号(int),工单号(int),多对多,无序。

现在通过一自定义函数,查得与输入订单号有关的全部订单号的最小值。

1、对应表中查不到输入订单号,未开工艺单,RETURN输入订单号;

2、对应表中只有一行订单号=输入订单号,即只有一个工单号与输入订单对应:

分支一:该工单号也只有一个,即订单工单一一对应,RETURN输入订单号;

分支二:该工单号不只一个,即输入订单与其它订单合用工单:

        再分支一:其它订单没有对应更多工单,RETURN min(输入订单+其它订单)

        再分支二:其它订单又引入了更多工单,        进入递归。。。,最终取得关系网中最小订单号;

3、订单表中有多行订单号=输入订单号,即有多个工单与输入订单对应:

       分支一:工单列表没有引入新的订单,RETURN输入订单号;

       分支二:工单列表引入了其它订单,        进入递归。。。,最终取得关系网中最小订单号;

研究了两天,终于憋出来一段sql,检查发现错误“无法从函数中访问临时表”。

痛定思过,函数可能使用递归,访问临时表有效率风险。

看看哪位朋友能帮忙解决一下(要考虑SQL2000能运行和执行效率)。

下面是我写的运行不了的SQL(部分,字数限制),献丑了。

set @PO=@InSoID

select dProcSheetID in #pp from v_SOrderProcSheet where dSoID=@InSoID --对应全部工单
select dSoID into #dd from v_SOrderProcSheet where (dProcSheetID in (select dProcSheetID from #pp) --反对应全部订单

while exists (select * from v_SOrderProcSheet where
(dSoID in (select dSoID from #dd)) and (dProcSheetID not in (select dProcSheetID from #pp))
begin --有未收录工单
insert #pp select dProcSheetID from v_SOrderProcSheet where dSoID in (select dSoID from #dd)
insert #dd select dSoID from v_SOrderProcSheet where dProcSheetID in (select dProcSheetID from #pp)
end

if exists (select * from #dd) then select @PO=min(dSoID) from #dd

return @PO
end

  • 写回答

1条回答 默认 最新

  • devmiao 2015-08-30 15:46
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料