日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2024/10/8 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用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中的递归返回多行数据的连接的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。