首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

求1简单树形SQL语句

2014-01-17 
求一简单树形SQL语句!数据库为sqlserver 2005 原表结构如下!create table test(id int primary key,name v

求一简单树形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           周哥         小罗

*/

[解决办法]
SELECT T.ID,T.NAME,T1.NAME test T LEFT JOIN test T1 ON T.ID=T1.pid 

热点排行