22,181
社区成员




--测试数据
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 小分市
--*/
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 行受影响)
*/
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