惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Google DeepMind News
Google DeepMind News
V
V2EX
B
Blog RSS Feed
有赞技术团队
有赞技术团队
博客园 - Franky
美团技术团队
月光博客
月光博客
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
腾讯CDC
云风的 BLOG
云风的 BLOG
L
LangChain Blog
GbyAI
GbyAI
The Cloudflare Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Check Point Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
博客园 - 【当耐特】
The Register - Security
The Register - Security
大猫的无限游戏
大猫的无限游戏
D
Docker
Vercel News
Vercel News
Blog — PlanetScale
Blog — PlanetScale
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
N
Netflix TechBlog - Medium
博客园_首页
A
About on SuperTechFans
J
Java Code Geeks
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Recent Announcements
Recent Announcements
G
Google Developers Blog
小众软件
小众软件
博客园 - 叶小钗
WordPress大学
WordPress大学
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Martin Fowler
Martin Fowler
S
SegmentFault 最新的问题
F
Full Disclosure
Jina AI
Jina AI
H
Help Net Security

博客园 - whale

Ajax提交失败,因为输入框带尖括号< listview添加列 - whale - 博客园 局域网中访问xp机器用户名为灰色,不能修改 SQL2005服务启动不了是因为VIA协议启动了 负载测试错误表包含:“未能找到应用阈值规则所需的从属计数器” CString, BSTR, LPCTSTR之间得关系和区别 移动流媒体技术及其应用发展方向(转载) - whale - 博客园 vs2005使用analysis service 项目出现错误尝试读取或写入受保护内存... - whale Excel连接Analysis service2005初始化数据源失败 SQL Server不能调试存储过程解决方法 文本框放到下拉框上面。 - whale - 博客园 ADO 读取Excel文件数据, 丢失数据或数据错误问题。 最好的.net学习资源 今天开始开发Mobile5.0项目 组件 访问被拒绝 配置错误 不同层的session在timeout后不能跨层访问的原因。 VB运行调试时提示不能修改 .net调试时,计算机调试管理服务被禁用的解决 局部变量的生命周期和委托的关系
利用SQL中的递归返回多行数据的连接
whale · 2006-09-01 · via 博客园 - whale

有个数据表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)