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