日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

利用SQL中的递归返回多行数据的连接

發(fā)布時(shí)間:2024/10/8 数据库 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用SQL中的递归返回多行数据的连接 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

有個(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。