求两个个SQL的存储过程(要用到游标)(100分)

  • 主题发起人 主题发起人 xl4772
  • 开始时间 开始时间
你老师厉害
 
懂了,谢谢各位老师的讲解
 
to uiit
我想weichao9999在DECLARE dataCR CURSOR For select OrdNo,COrdNo,PrdtID,Name,Color,Qty from t_HomeWork5
order by OrdNo,COrdNo,PrdtID,Name,Color,Qty 已经对表进行排序了吧,所以不可能出现你的顾虑吧“第三行又和第一行前几个字段相同时,你就不会正确结果了了”

这是我的想法,请大侠们指正呵呵
 
不好意思,排了,是我的疏忽,没看清
 
[:I]
第一次在这有人称我老师,受宠若惊!
四海之内皆兄弟,大家还是以兄弟相称吧!我也是愚笨的人,可能是多混了两天,多写了几行代码,所以对一些技术了解一些。非常高兴在这里贴出来与大家共享。

uiit兄出的题目比较考验人,如果是试面的话我一般都出几个联合查询的例子,这个难度的我不会出,因为好多人答不上来。
to xl4772

==to weichao9999:最后几行里面的
== set @OrdNo2 = @OrdNo
== set @COrdNo2 = @COrdNo
== set @PrdtID2 = @PrdtID
== set @Name2 = @Name
== set @Color2 = @Color
== set @Qty2 = @Qty
==
== FETCH NEXT FROM dataCR into @OrdNo,@COrdNo,@PrdtID,@Name,@Color,@Qty

==是什么意思?有没有必要放在这里,能不能删掉?!
==我的理解是:拿第一行和第二行比较,比较的结果写到第三行,然后第二行作为第一行和==下面一行比较。。。

当然不能删掉,看先面这几行数据:
050419-013 C34-403 PP_231N7DYD0000 N7勿溶点尾制 9346.00000000
N9勿溶点尾制 5456.00000000
PP_232N7MR00000 N7开金属右插 4673.00000000
N9开金属右插 2728.00000000
第三行比第二行多出了一个字段,为什么呢,肯定是一位这个字段的值和上一行不同,我一开始以为数据都是和第一个全行做比较的,所以我就保留了第一个全行和后面的数据比较,如果第一个字段值不等,我就把当前行作为新的比较标准继续向下循环,而且存储过程一些完了,但是出来的结果和楼主要求的不一致,我就仔细的看了这几行,发现它的规律要得到的数据是和上一行相比的结果,所以修改成现在这个。我那几行赋值代码就是保留的上一行的值,为下一轮比较做准备的,所以不能删除。

to liuguilg
你看得挺仔细,因为要得到的结果集的第一行肯定是全行,所以第一遍循环的时候可以不赋值,比较的结果肯定是运行最后一个判断,插入一个全行。

to uiit:
uiit兄水平高!
不过我认为处理这样一个结果肯定是逐行比,而且要得到的也是一个排序后的结果。不排序就没有意义了。
说到递归,我比较愚笨,没有思路,uiit兄出的题目,也提到了用递归,不妨把答案贴出来让我们学习学习,绝对是真心请教!
另外一个问题,在递归中声明游标是不是会出现‘此游标已存在的错误?我没试过,猜测。
 
to wei老师:
说来惭愧,俺是一菜鸟,知识碰巧知道存储过程和游标的简单用法。递归,我也是看到上面qcchan的简单例子才联想到才提起,所以也没试过。找个时间试一下,如有结果,一定贴出来
 
有个思路,还想了俩小时
(wei老师的带排序就比这个好,所以也懒得去试):
Create procedure Sort
as
declare my_cursor cursor for
...
fetch next my_cursor
while ...
begin
...--wei老师程序
create function sort(字段参数)
return @tb table()--临时表
as
begin
declare my_cursor2 cursor
for select ...from @tb
fetch ...
while
begin
..逐行比较
insert into @tb
fetch next my_cursor2
end
...
end
fetch next my_cursor
end;
...

也应该是游标嵌套的嵌套吧,不过肯定效率极低
 
谢谢大家,结帖咯
 
后退
顶部