首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

递归查询有关问题

2012-01-09 
递归查询问题did,dname,dpid11,研发部1组1 ,210,技术部2组 ,89,技术部1组 ,87,商务部3组 ,48,技术部,12,-1

递归查询问题
did,   dname,     dpid
11,   '研发部1组1 ',   2
10,   '技术部2组 ',   8
9,   '技术部1组 ',   8
7,   '商务部3组 ',   4
8,   技术部,   12,   -1
6,   '商务部2组 ',   4
5,   '商务部1组 ',   4
4,   '商务部 ',   -1
3,   '研发部2组 ',   1
1,   '研发部 ',   -1
2,   '研发部1组 ',   1
13,   '商务部1组1 ',   5
==========
dpid是上级部门的ID

========
我想查询  
1、4,   '商务部 ',   -1               的所有子部门
2、 '商务部1组1 ',   5               的父部门,最好从上到下排列


用标准sql语句,不用存储过程

谢谢


[解决办法]
up
[解决办法]
存储过程就是sql语句
[解决办法]
我想查询
1、4, '商务部 ', -1 的所有子部门
2、 '商务部1组1 ', 5 的父部门,最好从上到下排列
----------------------------------------------------
/*这样??????????*/
---1、方法1
Select * From T Where dpid
In(Select did From T Where dpid=-1 And dname= '商务部 ') Order By did
---方法2
Select * From T As A Where Exists
(Select 1 From T Where dpid=-1 And dname= '商务部 ' And did=A.dpid) Order By did
---2、方法1
Select * From T Where did
In(Select dpid From T Where did=13 And dname= '商务部1组1 ') Order By did
---方法2
Select * From T As A Where Exists
(Select dpid From T Where did=13 And dname= '商务部1组1 ' And dpid=A.did) Order By did
[解决办法]
去看看邹建 写的这篇文章吧:
http://blog.csdn.net/zjcxc/archive/2007/08/29/1763598.aspx
[解决办法]
create function fn_tree(
@type int,
@bm int
)
returns varchar(1000)
as
begin
declare @re varchar(1000)
if(@type=1)
begin
declare @dpid int
select @dpid=(select dpid from dbm where did=@bm)
if(@dpid=-1)
begin
select @re=ltrim(@dpid)
end
else
select @re=dbo.fn_tree(@type,@dpid)+ ', '+ltrim(@dpid)
end
else
begin
declare @did int
select @did=(select did from dbm where dpid=@bm)
if(@did is null)
set @did=-1
if(@did=-1)
begin
select @re=ltrim(@did)
end
else
select @re=dbo.fn_tree(@type,@did)+ ', '+ltrim(@did)
end
select @re=replace(@re, '-1 ', '0 ')
return @re
end


写一个找树的函数
2个参数
第一个参数表示找子或者是找父
1为找父,2为找子


可以直接调用函数


select fn_tree(1,did) from dbm
找父

select fn_tree(2,did) from dbm
找子

[解决办法]
我之前哪个函数把表名字改一下..
字段名我都照你的写的...

在select 的时候调用...
记录集 就是 0,3,5,2,6这样的
[解决办法]
select 11 did, N '研发部1组1 ' dname, 2 dpid into # union all
select 10, N '技术部2组 ', 8 union all
select 9, N '技术部1组 ', 8 union all
select 7, N '商务部3组 ', 4 union all
select 8, N '技术部 ', -1 union all


select 6, N '商务部2组 ', 4 union all
select 5, N '商务部1组 ', 4 union all
select 4, N '商务部 ', -1 union all
select 3, N '研发部2组 ', 1 union all
select 1, N '研发部 ', -1 union all
select 2, N '研发部1组 ', 1 union all
select 13, N '商务部1组1 ', 5

exec( '
select 4 id into #a
while @@rowcount> 0
insert into #a select #.did from # inner join #a on #.dpid=#a.id and #.did not in (select id from #a)
select * from #a order by id ')
drop table #

id
-----------
4
5
6
7
13

热点排行