有张表如下:
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 @[email protected]+1
INSERT @t_Level SELECT a.PARENTID,@Level
FROM tb a,@t_Level b
WHERE a.ID=b.ID AND [email protected]
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)
*/