日期:2014-05-18  浏览次数:20482 次

递归查询问题
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