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

求一句存储过程。。帮忙!!
有张表如下:
ID     PARENTID     LEVEL       NAME
001     null               0               院长
002     001                 1           化学系主任
003     001                 1           数学系主任
004     002                 2           化学教师
005     003                 2           数学教师

当查询条件为 '004,005 '时可以输出其所有上级信息。
结果为:
ID     PARENTID     LEVEL       NAME
001     null               0               院长
002     001                 1           化学系主任
003     001                 1           数学系主任

------解决方案--------------------
create table #T(ID int,PARENTID varchar(10),LEVEL int,NAME varchar(50))

insert into #T
select 001,null,0, '院长 ' union all
select 002, '001 ',1, '化学系主任 ' union all
select 003, '001 ',1, '数学系主任 ' union all
select 004, '002 ',2, '化学教师 ' union all
select 005, '003 ',2, '数学教师 '

select distinct b.*
from #T a
left join #T b
on a.level> b.level
where a.id in(004,005)

drop table #T
------解决方案--------------------
create table Tb(id varchar(10),PARENTID varchar(10),LEVEL int,NAME varchar(50))

insert into Tb
select '001 ',null,0, '院长 ' union all
select '002 ', '001 ',1, '化学系主任 ' union all
select '003 ', '001 ',1, '数学系主任 ' union all
select '004 ', '002 ',2, '化学教师 ' union all
select '005 ', '003 ',2, '数学教师 '
go

CREATE FUNCTION f_Pid(@ID char(3))
RETURNS @t_Level TABLE(ID char(3),Level int)
AS
BEGIN
DECLARE @Level int
SET @Level=1
INSERT @t_Level SELECT @ID,@Level
WHILE @@ROWCOUNT> 0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.PARENTID,@Level
FROM tb a,@t_Level b
WHERE a.ID=b.ID AND b.Level=@Level-1
END
RETURN
END
GO

select * from tb where PARENTID in (select id from dbo.f_pid( '004 ') where level> 2) or PARENTID is null

drop function f_pid
drop table Tb

/* 结果
id PARENTID LEVEL NAME
---------- ---------- ----------- --------------------------------------------------
001 NULL 0 院长
002 001 1 化学系主任
003 001 1 数学系主任

(3 row(s) affected)
*/