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