求一简单树形SQL语句!
数据库为sqlserver 2005 原表结构如下!
create table test(
id int primary key,
name varchar(10),
pid int--父级ID
);
数据如下:
insert into test values (1,'张三',1);
insert into test values (2,'李四',1);
insert into test values (3,'王五',2);
insert into test values (4,'小罗',3);
insert into test values (5,'周哥',4);
要求结果如下:
id 姓名 直属父级姓名
1 张三 张三
2 李四 张三
3 王五 李四
4 小罗 王五
5 周哥 小罗
实际环境的表结构稍复杂一些,请问如何使用一条SQL,实现这个结果,谢谢!
[解决办法]
是这样吗:
--drop table test
create table test(
id int primary key,
name varchar(10),
pid int--父级ID
);
insert into test values (1,'张三',1);
insert into test values (2,'李四',1);
insert into test values (3,'王五',2);
insert into test values (4,'小罗',3);
insert into test values (5,'周哥',4);
go
select t1.id,
t1.name 姓名,
t2.name as 直属父级姓名
from test t1
left join test t2
on t1.pid = t2.id
/*
id姓名直属父级姓名
1张三张三
2李四张三
3王五李四
4小罗王五
5周哥小罗
*/
--create table test(
-- id int primary key,
-- name varchar(10),
-- pid int--父级ID
--);
--insert into test values (1,'张三',1);
--insert into test values (2,'李四',1);
--insert into test values (3,'王五',2);
--insert into test values (4,'小罗',3);
--insert into test values (5,'周哥',4);
;WITH cte AS (
SELECT * ,name AS Fname
FROM test
WHERE id=pid
UNION ALL
SELECT a.id,a.NAME,a.pid,b.NAME AS Fname
FROM test a INNER JOIN cte b ON a.pid=b.id
WHERE a.id<>a.pid
)
SELECT id,name,Fname
FROM cte
/*
id name Fname
----------- ---------- ----------
1 张三 张三
2 李四 张三
3 王五 李四
4 小罗 王五
5 周哥 小罗
*/