利用SQL中的递归返回多行数据的连接
有個數據表testC,數據為
col???????????????????????????????????????????????
--------------------------------------------------
b
c
d
e
f
現在有語句
declare @entry varchar(100)
select @entry=Null
select @entry=coalesce(@entry+';','') + col from testC
select @entry
結果:
????????????????????????????????????????????????????????????????????????????????????????????????????
--------------------------------------
b;c;d;e;f???
(1 row(s) affected)
為什么結果會這樣呢,
其實這里面已經用上了遞歸,其中
select @entry=coalesce(@entry+';','') + col from testC
就是遞歸.
每次調用coalesce()里面的@entry的時候,這個@entry變量就會再調用coalesce(@entry+';','') + c,每一個層次調用+c,的時候,都會導致記錄集的指針下移。
先不看這個coalesce函數,簡化一下
declare @entry varchar(100)
select @entry='a'
select @entry=@entry+ col from testC
select @entry
結果為:
----------------------------------------------------------------------------------------------------
abcdef
等同于
select @entry=(((a+b)+c)+d)+e)+f
遞歸總需要有一個最終層次的返回,那最里面的(a+b)就是遞歸的返回嗎,顯然不是,應該單獨這個a就是最里面返回層的返回結果,也就是里面應該還有一層,那層是什么呢。是這記錄集的最后最前面吧。
再看一下
declare @entry varchar(100)
declare @bb varchar(100)
select @entry='a'
select @bb=@entry+ col from testC
select @bb
結果是
af
也就是說,在沒有遞歸的情況下,只返回和記錄集最后一個相加的結果,而有遞歸時,會從后面往前遞歸,因為每次進行和字段相加,會導致指針的移動,是從后往前移的,到記錄集的最前面的時候,遞歸就會返回。
create function dbo.addcol(@a varchar(10),@b varchar(10))
returns varchar(100)
as
begin
??? declare @entry varchar(100)
??? select @entry=null
??? select @entry=coalesce(@entry+';','')+c from testA where a= @a and b= @b
??? return @entry
end
go
select * from testA
select a, b, dbo.addcol(a,b) from testA group by a,b
drop function dbo.addcol
ID???? a????????? B????????? C?????????
------ ---------- ---------- ----------
1????? 1????????? 1????????? 11???????
2????? 1????????? 1????????? 111??????
3????? 1????????? 3????????? 13???????
4????? 1????????? 2????????? 12???????
5????? 1????????? 1????????? 1111?????
(5 row(s) affected)
a????????? b??????????????????????????????????????????????????????????????????????????????????????????????????????????????
---------- ---------- ----------------------------------------------------------------------------------------------------
1????????? 1????????? 11??????? ;111?????? ;1111?????
1????????? 2????????? 12???????
1????????? 3????????? 13???????
(3 row(s) affected)
?
轉載于:https://www.cnblogs.com/whalechen/archive/2006/09/01/492526.html
總結
以上是生活随笔為你收集整理的利用SQL中的递归返回多行数据的连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今日问题:操作必须使用一个可更新的查询。
- 下一篇: SQLServer存储过程/函数加/解密