SQL语句的问题 数据库查询

sxinhe 2013-10-24 09:41:00
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

这样的形式能实现麽 ?谢谢大家啦
...全文
142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen357313771 2013-10-24
  • 打赏
  • 举报
回复
楼上对的,我还没看规律呢,厚颜了。。
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
LongRui888 2013-10-24
  • 打赏
  • 举报
回复
是这样不:


if object_id('tb') is not null
   drop table tb
go

create 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,	NULL



select 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
*/
水族杰纶 2013-10-24
  • 打赏
  • 举报
回复
引用 2 楼 wufeng4552 的回复:
--try select a.name,isnull(b.name,'无') from tb a left join tb b on a.pid=b.id
貌似反了 a.id=b.pid
chen357313771 2013-10-24
  • 打赏
  • 举报
回复
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 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
水族杰纶 2013-10-24
  • 打赏
  • 举报
回复
--try select a.name,isnull(b.name,'无') from tb a left join tb b on a.pid=b.id
sxinhe 2013-10-24
  • 打赏
  • 举报
回复
在线等啊,谢谢大家啦,有没有这样的方法啊。
唐诗三百首 2013-10-24
  • 打赏
  • 举报
回复

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)
*/
xxfvba 2013-10-24
  • 打赏
  • 举报
回复
根本用不着循环
xxfvba 2013-10-24
  • 打赏
  • 举报
回复
with 循环吧 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

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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