sql 2000 递归查询
有一对应表,就两个字段:订单号(int),工单号(int),多对多,无序。现在通过一自定义函数,查得与输入订单号有关的全部订单号的最小值。1、对应表中查不到输入订单号,未...
有一对应表,就两个字段:订单号(int),工单号(int),多对多,无序。
现在通过一自定义函数,查得与输入订单号有关的全部订单号的最小值。
1、对应表中查不到输入订单号,未开工单,R
有一对应表,就两个字段:订单号(int),工单号(int),多对多,无序。
现在通过一自定义函数,查得与输入订单号有关的全部订单号的最小值。
1、对应表中查不到输入订单号,未开工单,RETURN输入订单号;
2、对应表中只有一行订单号=输入订单号,即只有一个工单号与输入订单对应:
分支一:该工单号也只有一个,即订单工单一一对应,RETURN输入订单号;
分支二:该工单号不只一个,即输入订单与其它订单合用工单:
再分支一:其它订单没有对应更多工单,RETURN min(输入订单+其它订单)
再分支二:其它订单又引入了更多工单, 进入递归。。。,最终取得关系网中最小订单号;
3、订单表中有多行订单号=输入订单号,即有多个工单与输入订单对应:
分支一:工单列表没有引入新的订单,RETURN输入订单号;
分支二:工单列表引入了其它订单, 进入递归。。。,最终取得关系网中最小订单号;
研究了两天,终于憋出来一段sql,检查发现错误“无法从函数中访问临时表”。
痛定思过,函数可能使用递归,访问临时表有效率风险。
看看哪位朋友能帮忙解决一下(要考虑SQL2000能运行和执行效率)。
我就18点财富,全拿出来了。
下面是我写的运行不了的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、对应表中查不到输入订单号,未开工单,R
有一对应表,就两个字段:订单号(int),工单号(int),多对多,无序。
现在通过一自定义函数,查得与输入订单号有关的全部订单号的最小值。
1、对应表中查不到输入订单号,未开工单,RETURN输入订单号;
2、对应表中只有一行订单号=输入订单号,即只有一个工单号与输入订单对应:
分支一:该工单号也只有一个,即订单工单一一对应,RETURN输入订单号;
分支二:该工单号不只一个,即输入订单与其它订单合用工单:
再分支一:其它订单没有对应更多工单,RETURN min(输入订单+其它订单)
再分支二:其它订单又引入了更多工单, 进入递归。。。,最终取得关系网中最小订单号;
3、订单表中有多行订单号=输入订单号,即有多个工单与输入订单对应:
分支一:工单列表没有引入新的订单,RETURN输入订单号;
分支二:工单列表引入了其它订单, 进入递归。。。,最终取得关系网中最小订单号;
研究了两天,终于憋出来一段sql,检查发现错误“无法从函数中访问临时表”。
痛定思过,函数可能使用递归,访问临时表有效率风险。
看看哪位朋友能帮忙解决一下(要考虑SQL2000能运行和执行效率)。
我就18点财富,全拿出来了。
下面是我写的运行不了的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 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询