id name pid memo
1 总公司 0 ddd
2 财务部门 1 NULL
3 生产部门 1 NULL
4 分公司 0 NULL
5 分财务部门 4 NULL
7 分生产部门 4 NULL
8 分1 0 NULL
9 财务1 8 NULL
10 成产1 8 NULL
我想实现的是这样的结果 总公司 无
财务部门 总公司
生产部门 总公司
分公司 无
分财务部门 分公司
分生产部门 分公司
分1 无
财务1 分1
生产1 分1这样的形式能实现麽 ?谢谢大家啦数据库sql
1 总公司 0 ddd
2 财务部门 1 NULL
3 生产部门 1 NULL
4 分公司 0 NULL
5 分财务部门 4 NULL
7 分生产部门 4 NULL
8 分1 0 NULL
9 财务1 8 NULL
10 成产1 8 NULL
我想实现的是这样的结果 总公司 无
财务部门 总公司
生产部门 总公司
分公司 无
分财务部门 分公司
分生产部门 分公司
分1 无
财务1 分1
生产1 分1这样的形式能实现麽 ?谢谢大家啦数据库sql
select a.name,isnull(b.name,'无')
from tb a left join tb b
on a.pid=b.id
AS (
SELECT 1, N'总公司',0,'ddd' UNION ALL
SELECT 2, N'财务部门', 1,NULL UNION ALL
SELECT 3, N'生产部门', 1,NULL UNION ALL
SELECT 4, N'分公司',0,NULL UNION ALL
SELECT 5, N'分财务部门',4,NULL UNION ALL
SELECT 7, N'分生产部门',4,NULL UNION ALL
SELECT 8, N'分1',0,NULL UNION ALL
SELECT 9, N'财务1', 8, NULL UNION ALL
SELECT 10, N'成产1',8, NULL
)
SELECT Name
,CASE WHEN Pid=0 THEN N'无'
WHEN Pid=1 THEN N'总公司'
WHEN Pid=4 THEN N'分公司'
WHEN Pid=8 THEN N'分1'
ELSE '' END AS col
FROM CTE
if object_id('tb') is not null
drop table tb
gocreate table tb(Id int,Name varchar(20),Pid int,Memo varchar(100))insert into tb
SELECT 1, N'总公司',0,'ddd' UNION ALL
SELECT 2, N'财务部门', 1,NULL UNION ALL
SELECT 3, N'生产部门', 1,NULL UNION ALL
SELECT 4, N'分公司',0,NULL UNION ALL
SELECT 5, N'分财务部门',4,NULL UNION ALL
SELECT 7, N'分生产部门',4,NULL UNION ALL
SELECT 8, N'分1',0,NULL UNION ALL
SELECT 9, N'财务1', 8, NULL UNION ALL
SELECT 10, N'成产1',8, NULLselect t1.name,
case when t2.name is null then '无' else t2.name end as name
from tb t1
left join tb t2
on t1.pid = t2.id
/*
name name
总公司 无
财务部门 总公司
生产部门 总公司
分公司 无
分财务部门 分公司
分生产部门 分公司
分1 无
财务1 分1
成产1 分1
*/
WITH CTE(Id,Name,Pid,Memo)
AS (
SELECT 1, N'总公司',0,'ddd' UNION ALL
SELECT 2, N'财务部门', 1,NULL UNION ALL
SELECT 3, N'生产部门', 1,NULL UNION ALL
SELECT 4, N'分公司',0,NULL UNION ALL
SELECT 5, N'分财务部门',4,NULL UNION ALL
SELECT 7, N'分生产部门',4,NULL UNION ALL
SELECT 8, N'分1',0,NULL UNION ALL
SELECT 9, N'财务1', 8, NULL UNION ALL
SELECT 10, N'成产1',8, NULL
)
SELECT DISTINCT A.Name,ISNULL(B.Name,N'无') AS Col
FROM CTE AS A
LEFT JOIN CTE AS B
ON A.pid=B.Id
WITH CTE(Id,Name,Pid,Memo)
AS (
SELECT 1, N'总公司',0,'ddd' UNION ALL
SELECT 2, N'财务部门', 1,NULL UNION ALL
SELECT 3, N'生产部门', 1,NULL UNION ALL
SELECT 4, N'分公司',0,NULL UNION ALL
SELECT 5, N'分财务部门',4,NULL UNION ALL
SELECT 7, N'分生产部门',4,NULL UNION ALL
SELECT 8, N'分1',0,NULL UNION ALL
SELECT 9, N'财务1', 8, NULL UNION ALL
SELECT 10, N'成产1',8, NULL
),
cte1 as
(select [id],[name],pid from CTE where Pid=0
union all
select b.Id,b.Name,a.Id from cte1 a,CTE b where a.Id=b.Pid)
select a.Name,b.name from cte1 a left join cte b on a.pid=b.id order by a.id
create table sx
(id int, name varchar(10), pid int, memo varchar(10))insert into sx
select 1,'总公司',0,'ddd' union all
select 2,'财务部门',1,NULL union all
select 3,'生产部门',1,NULL union all
select 4,'分公司',0,NULL union all
select 5,'分财务部门',4,NULL union all
select 7,'分生产部门',4,NULL union all
select 8,'分1',0,NULL union all
select 9,'财务1',8,NULL union all
select 10,'成产1',8,NULL
select a.name 'name',
isnull(b.name,'无') 'pname'
from sx a
left join sx b on a.pid=b.id/*
name pname
---------- ----------
总公司 无
财务部门 总公司
生产部门 总公司
分公司 无
分财务部门 分公司
分生产部门 分公司
分1 无
财务1 分1
成产1 分1(9 row(s) affected)
*/