sql递归查询问题
来源:互联网 发布:怎样做网络销售 编辑:程序博客网 时间:2024/04/30 06:28
id upperid
1 2
3 2
4 1
5 3
比如说 upperid =2
那么先找到1,3,然后再由1,3找到4,5
insert into t
select 1, 2
union all select 3, 2
union all select 4, 1
union all select 5, 3
select * from t
create function aa(@upperid int)
returns @t table (id int,upperid int,level int)
as
begin
declare @i int
set @i=1
insert into @t
select *,@i from t where upperid=@upperid
while @@rowcount>0
begin
set @i=@i+1
insert into @t
select a.*,@i from t a left join @t b on a.upperid=b.id
where b.level=@i-1
end
return
end
----------- ----------- -----------
4 1 1
----------- ----------- -----------
1 2 1
3 2 1
4 1 2
5 3 2
这个需要level这个数,否则得不到.
if object_id('tbTest') is not null
drop table tbTest
if object_id('spGetChildren') is not null
drop proc spGetChildren
GO
create table tbTest(id int, upperid int)
insert tbTest
select 1, 2 union all
select 3, 2 union all
select 4, 1 union all
select 5, 3
GO
----创建存储过程
create proc spGetChildren @id int
as
declare @t table(id int)
insert @t select id from tbTest where upperid = @id
while @@rowcount > 0
insert @t select a.id from tbTest as a inner join @t as b
on a.upperid = b.id and a.id not in(select id from @t)
select * from @t
GO
declare @upperid int
set @upperid = 2
EXEC spGetChildren @upperid
drop proc spGetChildren
drop table tbTest
id
-----------
1
3
4
5
*/
这个就符合我的要求了.
returns @t table(id varchar(20))
as
begin
insert @t select wayid from tb where upperwayid = @id
while @@rowcount > 0
insert @t select a.wayid from tb as a inner join @t as b
on a.upperwayid = b.id and a.wayid not in(select id from @t)
return
end
表结构是这样的
部门 上级部门
A B
B C
C D
A A
B B
C C
求一条SQL语句,根据A查其上级部门,查询结果为
上级部门
B
C
D
=================================================
用函数
create table tb (部门 varchar(20),上级部门 varchar(20))
insert into tb select 'A','B' union all select 'B','C' union all select 'C','D'
union all select 'A','A' union all select 'B','B' union all select 'C','C'
--select * from tb
create function test_f (@name varchar(20))
returns @ta table(上级部门 varchar(20))
as
begin
--select @name=上级部门 from tb where 部门=@name and 部门!=上级部门
while exists(select 1 from tb where 部门=@name and 部门!=上级部门)
begin
insert @ta select 上级部门 from tb where 部门=@name and 部门!=上级部门
select @name=上级部门 from tb where 部门=@name and 部门!=上级部门
end
return
end
select * from dbo.test_f('A')
删除:
drop function test_f
drop table tb
上级部门
--------------------
B
C
D
- sql递归查询问题
- sql递归查询问题
- sql递归查询问题
- sql递归查询问题
- sql递归查询问题
- SQL 递归查询
- SQL 递归查询
- SQL递归查询
- sql 递归查询
- SQL Server 递归查询
- SQL递归查询
- SQL递归查询函数
- SQL递归查询数据
- Sql 递归查询
- SQL递归查询函数
- SQL递归查询部门
- Sql 2005 递归查询
- SQL递归查询数据
- php消息队列
- Java Interface 是常量存放的最佳地点吗?
- 高可用集群heartbeat全攻略
- stm32 i2c通信 [操作寄存器+库函数]
- 关于zbar的libzbar.a不支持ipnone5的64bit问题
- sql递归查询问题
- android CheckBox的运用
- Linux---Nagios监控出图
- sumo生成trace,导入ns3并生成Animation过程(整理)
- NSPredicate
- 花样Android ProgressBar 史上最强大讲解
- Android解析XML总结(SAX、Pull、Dom三种方式)
- 学会释怀,学会坦然
- stm32 i2c通信 [操作寄存器+库函数]