大家帮帮忙!

Sunnyyu2008 2009-04-09 04:10:20
标的结构:

ID Name, ManagerID
0012 AAA 0011
0011 SSS 0011
0101 DDD 0012
0120 ASA 0014
0014 AAf 0015
0015 sss 0015

表中记录了人员信息。这些人员都有领导者即Managerid,同时又领导别人既是别人的managerid. 例如:
0012的领导是0011,而0012有时0101的领导者。如果一个人的领导者是自己那么它就是最高领导如:0011。

现在的 问题是这个表中有上万条数据。有时候需要将这些数据按级别进行排序同级别的按id排序。

如果用递归的话特别慢,大家有什么好办法嘛? 谢谢。
...全文
127 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END

--显示结果
SELECT a.*
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
ID PID Name
------ --------- ----------
001 NULL 山东省
002 001 烟台市
004 002 招远市
003 001 青岛市
005 NULL 四会市
006 005 清远市
007 006 小分市
--*/
等不到来世 2009-04-10
  • 打赏
  • 举报
回复
sql2005的解法:
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([ID] varchar(4),[Name] varchar(3),[ManagerID] varchar(4))
insert [tb]
select '0012','AAA','0011' union all
select '0011','SSS','0011' union all
select '0101','DDD','0012' union all
select '0120','ASA','0014' union all
select '0014','AAf','0015' union all
select '0015','sss','0015'
go
--select * from [tb]

with szx as
(
select *,topid=id,flg=1 from tb where id=ManagerID
union all
select a.*,b.topid,b.flg+1
from tb a join szx b
on a.ManagerID=b.id and a.id<>a.ManagerID
)
select ID,Name,ManagerID,flg
from szx
order by topid,flg
/*
ID Name ManagerID flg
---- ---- --------- -----------
0011 SSS 0011 1
0012 AAA 0011 2
0101 DDD 0012 3
0015 sss 0015 1
0014 AAf 0015 2
0120 ASA 0014 3

(6 行受影响)
*/
Sunnyyu2008 2009-04-10
  • 打赏
  • 举报
回复
你得办法很好。不过我要得结果不是这个样子。就像遍历数一样先父结点,在左子树,然后右子树。例如:
/*
ID Name ManagerID flg
---------- ---------- ---------- -----------
0011 SSS 0011 1
0012 AAA 0011 2
0101 DDD 0012 3
0015 sss 0015 1
0014 AAf 0015 2
0120 ASA 0014 3
*/

Top
|
-------------
| |
0011 0015
| |
--------- -------
| | | |
0012 0014
| |
------- ------
| |
0101 0120

谢谢大家。谁有好办法。
ws_hgo 2009-04-09
  • 打赏
  • 举报
回复
来晚了
刚才
还是0回复
ws_hgo 2009-04-09
  • 打赏
  • 举报
回复
先看下
-晴天 2009-04-09
  • 打赏
  • 举报
回复
create table tb(ID varchar(10),[Name] varchar(10),ManagerID varchar(10))
insert into tb select '0012','AAA','0011'
insert into tb select '0011','SSS','0011'
insert into tb select '0101','DDD','0012'
insert into tb select '0120','ASA','0014'
insert into tb select '0014','AAf','0015'
insert into tb select '0015','sss','0015'
go
alter table tb add flg int
go
update tb set flg=1 where id=managerid
update tb set flg=2 from tb a where id<>managerid and exists(select 1 from tb where id=a.managerid and flg=1)
update tb set flg=3 from tb a where id<>managerid and exists(select 1 from tb where id=a.managerid and flg=2)
update tb set flg=4 from tb a where id<>managerid and exists(select 1 from tb where id=a.managerid and flg=3)
--......
select * from tb order by flg
go
drop table tb
/*
ID Name ManagerID flg
---------- ---------- ---------- -----------
0011 SSS 0011 1
0015 sss 0015 1
0012 AAA 0011 2
0014 AAf 0015 2
0101 DDD 0012 3
0120 ASA 0014 3
*/
  • 打赏
  • 举报
回复
sql server 2005的话试试cte吧

USE tempdb
GO

-- 建立演示环境
CREATE TABLE Dept(
id int PRIMARY KEY,
parent_id int,
name nvarchar(20))
INSERT Dept
SELECT 0, 0, N'<全部>' UNION ALL
SELECT 1, 0, N'财务部' UNION ALL
SELECT 2, 0, N'行政部' UNION ALL
SELECT 3, 0, N'业务部' UNION ALL
SELECT 4, 0, N'业务部' UNION ALL
SELECT 5, 4, N'销售部' UNION ALL
SELECT 6, 4, N'MIS' UNION ALL
SELECT 7, 6, N'UI' UNION ALL
SELECT 8, 6, N'软件开发' UNION ALL
SELECT 9, 8, N'内部开发'
GO

-- 查询指定部门下面的所有部门
DECLARE @Dept_name nvarchar(20)
SET @Dept_name = N'MIS'
;WITH
DEPTS AS(
-- 定位点成员
SELECT * FROM Dept
WHERE name = @Dept_name
UNION ALL
-- 递归成员, 通过引用CTE自身与Dept基表JOIN实现递归
SELECT A.*
FROM Dept A, DEPTS B
WHERE A.parent_id = B.id
)
SELECT * FROM DEPTS
GO

-- 删除演示环境
DROP TABLE Dept
Sunnyyu2008 2009-04-09
  • 打赏
  • 举报
回复
各位大哥大姐有什么好方法。谢谢

22,181

社区成员

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

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