利用SQL中的递归返回多行数据的连接
有個(gè)數(shù)據(jù)表testC,數(shù)據(jù)為
col???????????????????????????????????????????????
--------------------------------------------------
b
c
d
e
f
現(xiàn)在有語句
declare @entry varchar(100)
select @entry=Null
select @entry=coalesce(@entry+';','') + col from testC
select @entry
結(jié)果:
????????????????????????????????????????????????????????????????????????????????????????????????????
--------------------------------------
b;c;d;e;f???
(1 row(s) affected)
為什么結(jié)果會(huì)這樣呢,
其實(shí)這里面已經(jīng)用上了遞歸,其中
select @entry=coalesce(@entry+';','') + col from testC
就是遞歸.
每次調(diào)用coalesce()里面的@entry的時(shí)候,這個(gè)@entry變量就會(huì)再調(diào)用coalesce(@entry+';','') + c,每一個(gè)層次調(diào)用+c,的時(shí)候,都會(huì)導(dǎo)致記錄集的指針下移。
先不看這個(gè)coalesce函數(shù),簡(jiǎn)化一下
declare @entry varchar(100)
select @entry='a'
select @entry=@entry+ col from testC
select @entry
結(jié)果為:
----------------------------------------------------------------------------------------------------
abcdef
等同于
select @entry=(((a+b)+c)+d)+e)+f
遞歸總需要有一個(gè)最終層次的返回,那最里面的(a+b)就是遞歸的返回嗎,顯然不是,應(yīng)該單獨(dú)這個(gè)a就是最里面返回層的返回結(jié)果,也就是里面應(yīng)該還有一層,那層是什么呢。是這記錄集的最后最前面吧。
再看一下
declare @entry varchar(100)
declare @bb varchar(100)
select @entry='a'
select @bb=@entry+ col from testC
select @bb
結(jié)果是
af
也就是說,在沒有遞歸的情況下,只返回和記錄集最后一個(gè)相加的結(jié)果,而有遞歸時(shí),會(huì)從后面往前遞歸,因?yàn)槊看芜M(jìn)行和字段相加,會(huì)導(dǎo)致指針的移動(dòng),是從后往前移的,到記錄集的最前面的時(shí)候,遞歸就會(huì)返回。
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)
?
轉(zhuǎn)載于:https://www.cnblogs.com/whalechen/archive/2006/09/01/492526.html
總結(jié)
以上是生活随笔為你收集整理的利用SQL中的递归返回多行数据的连接的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 今日问题:操作必须使用一个可更新的查询。
- 下一篇: SQLServer存储过程/函数加/解密