求一简单树形SQL语句!

山城忙碌人 2014-01-14 04:20:13

数据库为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,实现这个结果,谢谢!
...全文
192 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
山城忙碌人 2014-01-15
  • 打赏
  • 举报
回复
引用 3 楼 fengylm 的回复:
SELECT T.ID,T.NAME,T1.NAME test T LEFT JOIN test T1 ON T.ID=T1.pid
谢谢兄弟,昨天我自己已经写出来,可惜把字段写反了,所以。。。。。。。。
山城忙碌人 2014-01-15
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
--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           周哥         小罗

*/
谢谢兄弟,昨天我自己已经写出来,可惜把字段写反了,所以。。。。。。。。
山城忙碌人 2014-01-15
  • 打赏
  • 举报
回复
引用 1 楼 yupeigu 的回复:
是这样吗:

--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	周哥	小罗
*/       
谢谢兄弟,昨天我自己已经写出来,可惜把字段写反了,所以。。。。。。。。
fengylm 2014-01-14
  • 打赏
  • 举报
回复
SELECT T.ID,T.NAME,T1.NAME test T LEFT JOIN test T1 ON T.ID=T1.pid
發糞塗牆 2014-01-14
  • 打赏
  • 举报
回复
--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           周哥         小罗

*/
LongRui888 2014-01-14
  • 打赏
  • 举报
回复
是这样吗:

--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	周哥	小罗
*/       

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧