大家帮帮忙!

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排序。

如果用递归的话特别慢,大家有什么好办法嘛? 谢谢。
...全文
132 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
  • 打赏
  • 举报
回复
各位大哥大姐有什么好方法。谢谢
【特征工程是什么?】 身高不同的两人,比较体重毫无意义, 但是如果将身高体重加以计算,转化成了BMI指数:BMI=体重/(身高^2) 通过比较这个新创造的特征值,谁胖谁瘦就一目了然了。 这就是特征工程,将原始数据转换为可以更好的、代表预测模型潜在问题的特征,通过分析这个新的特征,可以得到更准确的预测结果。 【特征工程——Python数据分析必备】 脏数据的“清洗剂” 有人说:学会了Python语言,就会做数据分析? 不一定! 你拿到的数据样本集,有可能存在这些问题: 如果样本数据存在问题,对数据建模的执行效率会有很大影响,甚至可能会造成模型结果的偏差。 不懂特征工程,数据分析=白忙一场! 【站内首门!特征工程全解课程】 过去,数字化是企业优化的要点; 而今,数字化成为了企业活下去的关键。 而数据分析应用有多广,特征工程的学习需求就有多大。 不过,大部分课本对于特征工程这一知识点鲜有提及,市面上的课程也少之又少,导致很多人在实际工作或学习中,遇到问题束手无策,严重降低效率。 CSDN全站首发——Python数据处理与特征工程 课程聚焦数据科学中,数据清洗与分析前的特征提取过程,解决数据科学中最重要的原始数据清洗和特征提取。 【定制课程 精准扫除学习盲点】 课程充分考虑各类实际问题,将每个知识点融入到对应的代码实例中,初学者也可无压力上手,讲师手把手带领入门。 知识点扫盲 + 案例实践 + 线上答疑 扫清数据分析前的所有障碍,提升你的数据工作的效率与准确度。 如果你是: 在这里你可以收获...... 了解如何将各类型数据载入计算机,进而愉快的探索数据科学; 掌握如何将需要分析的数据转化为算法模型可以接受的格式; 学会特征提取最基本的处理方式,为后续的算法学习打好基础。 经过19节课程的学习,你可以基本掌握数据采集、读取以及清洗的方法,具备进一步学习数据分析乃至深度学习的能力,能够大大拓宽你日后的求职道路。 【三重福利  惊喜等你】

22,210

社区成员

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

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