就求 一个查询的语句

jyganjun 2011-02-10 05:42:09
有各数据表记录是这样的
ClassID ParentID ClassName
1 0 医院概况
2 0 医院动态
3 0 科室介绍
4 1 医院简介
5 1 医院领导介绍
6 1 院长致辞

转换成这样的
ClassID ParentID ClassName
1 0 医院概况
4 1 医院简介
5 1 医院领导介绍
6 1 院长致辞
2 0 医院动态
3 0 科室介绍
其实就是父子关系表 子类紧跟父类
...全文
122 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyganjun 2011-02-10
  • 打赏
  • 举报
回复
上面楼主 一层可能有多种 二层也可能有多个的
jyganjun 2011-02-10
  • 打赏
  • 举报
回复
高手确实厉害啊
上面tree确实是一个权限集合 子集是具体的权限
下面的需求是这样的
楼上返回的集需要和另外一个表对比
4 1 医院简介
5 1 医院领导介绍
得到一个

ClassID ParentID ClassName 使用该权限
1 0 医院概况
4 1 医院简介 使用
5 1 医院领导介绍 使用
6 1 院长致辞
2 0 医院动态
3 0 科室介绍

这样的

在权限设计了可以简洁的使用CheckBox 完成权限的编辑
谢谢上面的楼主
-晴天 2011-02-10
  • 打赏
  • 举报
回复
如果只有两级,可以:
create table tb(ClassID int,ParentID int,ClassName nvarchar(10))
insert into tb
select 1,0,'医院概况' union all
select 2,0,'医院动态' union all
select 3,0,'科室介绍' union all
select 4,1,'医院简介' union all
select 5,1,'医院领导介绍' union all
select 6,1,'院长致辞'
go
select * from tb order by (case when parentid=0 then classid else parentid end)
go
drop table tb
/*
ClassID ParentID ClassName
----------- ----------- ----------
1 0 医院概况
4 1 医院简介
5 1 医院领导介绍
6 1 院长致辞
2 0 医院动态
3 0 科室介绍

(6 行受影响)
*/
jyganjun 2011-02-10
  • 打赏
  • 举报
回复
它本身是tree用递归可以 但体现不出sql语句简洁了
gw6328 2011-02-10
  • 打赏
  • 举报
回复
感觉这种在程序里的递归,数据表中的记录本来就没有先后之分的。
要不就是写个方法递归。
jyganjun 2011-02-10
  • 打赏
  • 举报
回复
我需要一个access 的可以吗
dawugui 2011-02-10
  • 打赏
  • 举报
回复
--上为sql 2005写法,下为sql 2000用函数的方法.


create table tb (id int , Name varchar(10) , pid int )
insert into tb values(1 ,'广东省' , 0)
insert into tb values(2 ,'四川省' , 0)
insert into tb values(3 ,'湖北省' , 0)
insert into tb values(4 ,'东莞市' , 1)
insert into tb values(5 ,'广州市' , 1)
insert into tb values(6 ,'天河区' , 5)
insert into tb values(7 ,'绵阳市' , 2)
insert into tb values(8 ,'武汉市' , 3)
insert into tb values(9 ,'汉口区' , 8)
insert into tb values(10,'随州市' , 3)
go

create function f_getnum(@id int) returns varchar(4000)
as
begin
declare @ret varchar(4000) , @pid int
set @ret = right(' ' + rtrim(@id) , 4)
while exists(select 1 from tb where id = @id and pid <> 0 )
begin
select @pid = pid from tb where id = @id and pid <> 0
set @id = @pid
set @ret = right(' ' + rtrim(@id) , 4) + @ret
end
return @ret
end
go

select id , name , REPLICATE(' ' , len(dbo.f_getnum(id))/4 - 1) + name as name from tb order by dbo.f_getnum(id)

drop function f_getNum
drop table tb

/*
id name name
----------- ---------- --------------
1 广东省 广东省
4 东莞市 东莞市
5 广州市 广州市
6 天河区 天河区
2 四川省 四川省
7 绵阳市 绵阳市
3 湖北省 湖北省
8 武汉市 武汉市
9 汉口区 汉口区
10 随州市 随州市

(所影响的行数为 10 行)
*/
dawugui 2011-02-10
  • 打赏
  • 举报
回复

/*
标题:SQL SERVER 2005中树结构按照各顶级节点排序
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2010-10-24
地点:陕西西安
说明:
如下树级结构中需要按照各顶级节点排序
id pid name
---- ---- ----------
001 000 广东省
002 001 广州市
003 001 深圳市
004 002 天河区
005 003 罗湖区
006 003 福田区
007 003 宝安区
008 007 西乡镇
009 007 龙华镇
010 007 松岗镇
011 000 江西省
012 011 南昌市
013 012 南昌县
014 012 新建县
015 012 进贤县
016 012 安义县
017 013 麻丘镇
018 011 九江市
需要的结果:
id name pid
---- ---------- ----
001 广东省 000
002 广州市 001
004 天河区 002
003 深圳市 001
005 罗湖区 003
006 福田区 003
007 宝安区 003
008 西乡镇 007
009 龙华镇 007
010 松岗镇 007
011 江西省 000
012 南昌市 011
013 南昌县 012
017 麻丘镇 013
014 新建县 012
015 进贤县 012
016 安义县 012
018 九江市 011
*/

create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
insert into tb values('001' , '000' , N'广东省')
insert into tb values('002' , '001' , N'广州市')
insert into tb values('003' , '001' , N'深圳市')
insert into tb values('004' , '002' , N'天河区')
insert into tb values('005' , '003' , N'罗湖区')
insert into tb values('006' , '003' , N'福田区')
insert into tb values('007' , '003' , N'宝安区')
insert into tb values('008' , '007' , N'西乡镇')
insert into tb values('009' , '007' , N'龙华镇')
insert into tb values('010' , '007' , N'松岗镇')
insert into tb values('011' , '000' , N'江西省')
insert into tb values('012' , '011' , N'南昌市')
insert into tb values('013' , '012' , N'南昌县')
insert into tb values('014' , '012' , N'新建县')
insert into tb values('015' , '012' , N'进贤县')
insert into tb values('016' , '012' , N'安义县')
insert into tb values('017' , '013' , N'麻丘镇')
insert into tb values('018' , '011' , N'九江市')
go

;with t as
(
select px = cast(id as varchar(500)) , * from tb t
where not exists(select 1 from tb where id = t.pid)
union all
select cast(b.px + ',' + a.id as varchar(500)) , a.*
from tb a , t b where a.pid = b.id
)
select id , name , pid from t order by px

drop table tb

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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