SQL Server递归查询(含向上查询及向下查询)

源数据展示:

SQL Server递归查询(含向上查询及向下查询)

 

向上递归查询


--向上递归查询
with temp (sid,mid,Name)
as
(
select sid,mid,Name from tServerClass
where sid='30'
union all
select a.sid, a.mid,a.Name from tServerClass a
inner join temp on a.sid = temp.mid
)

--不拼接查询
select * from temp
--某一个字段拼接展示
--select stuff((select  '_'+convert(nvarchar(50), Name) from temp order by sid  for xml path('')),1,1,'')

不拼接查询结果

SQL Server递归查询(含向上查询及向下查询)

指定字段拼接查询结果

SQL Server递归查询(含向上查询及向下查询)

向下递归


--向下递归
with temp (sid,mid,Name)
as
(
select sid,mid,Name from tServerClass
where sid=1
union all
select a.sid,a.mid,a.Name from tServerClass a
inner join temp on a.mid = temp.sid
)
select * from temp

查询结果如图

SQL Server递归查询(含向上查询及向下查询)

其中用到了递归和字符串拼接,查询也可以用在循环查询数据

以下是一个循环查询使用递归查询



--循环递归查询
--创建临时表
create table #AdvCodeTable
(
code nvarchar(200),
advname nvarchar(200)
)
declare @i int
declare @max int
declare @Code nvarchar(200)
declare @AdvName nvarchar(500)

select @max = max(SDefineId) from tServerDefine
select @i = min(SDefineId) from tServerDefine
--创建循环
while @i<aaa@qq.com
begin
--递归查询
with temp (sid,mid,Name)
as
(
select sid,mid,Name from tServerClass
where aaa@qq.com
union all
select a.sid, a.mid,a.Name from tServerClass a
inner join temp on a.sid = temp.mid
)
--得到想要的结果Name
select @AdvName = stuff((select  '_'+convert(nvarchar(50), Name) from temp order by sid  for xml path('')),1,1,'')
--查询数据的Code
SELECT @Code = Code FROM dbo.tServerDefine where SDefineId = @i
set @i = @i+1
--将每次循环得到的数据插入临时表中
insert into #AdvCodeTable values (@Code,@AdvName)
end
--执行完成,查询临时表得到结果
select * from #AdvCodeTable

--每次执行完成删除临时表
drop table #AdvCodeTable


结果展示:因为有一些特殊数据,加了一点码

SQL Server递归查询(含向上查询及向下查询)

 

 

 

 

 

 

 

猜你喜欢