如表 tid tm name
-------------------------
1 0 新闻
2 0 产品
3 0 信息
4 0 关于
5 1 内部新闻
6 1 外部新闻
7 3 行业信息
求排列
id tm name
-------------------------
1 0 新闻
5 1 内部新闻
6 1 外部新闻
2 0 产品
3 0 信息
7 3 行业信息
4 0 关于
-------------------------
1 0 新闻
2 0 产品
3 0 信息
4 0 关于
5 1 内部新闻
6 1 外部新闻
7 3 行业信息
求排列
id tm name
-------------------------
1 0 新闻
5 1 内部新闻
6 1 外部新闻
2 0 产品
3 0 信息
7 3 行业信息
4 0 关于
--测试数据
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 SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
|--山东省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/
---------------------------------
-- Author: htl258(Tony)
-- Date : 2009-07-09 17:13:05
---------------------------------
--> 生成测试数据表:tbIf not object_id('[tb]') is null
Drop table [tb]
Go
Create table [tb]([id] int,[tm] int,[name] nvarchar(4))
Insert tb
Select 1,0,'新闻' union all
Select 2,0,'产品' union all
Select 3,0,'信息' union all
Select 4,0,'关于' union all
Select 5,1,'内部新闻' union all
Select 6,1,'外部新闻' union all
Select 7,3,'行业信息'
Go
--Select * from tb-->SQL查询如下:
;with t as
(
select *,px=id from tb where tm=0
union all
select tb.*,t.px from tb,t where tb.tm=t.id
)
select id,tm,name from t order by px/*
id tm name
----------- ----------- ----
1 0 新闻
5 1 内部新闻
6 1 外部新闻
2 0 产品
3 0 信息
7 3 行业信息
4 0 关于(7 行受影响)
*/
INSERT INTO @tab
SELECT 1, 0 , '新闻' UNION ALL
SELECT 2, 0 , '产品' UNION ALL
SELECT 3 , 0 , '信息' UNION ALL
SELECT 4, 0 , '关于' UNION ALL
SELECT 5, 1 , '内部新闻' UNION ALL
SELECT 6, 1 , '外部新闻' UNION ALL
SELECT 7, 3 , '行业信息' select * from @tab order by (case when tm=0 then id else tm end),id
id tm NAME
----------- ----------- --------------------
1 0 新闻
5 1 内部新闻
6 1 外部新闻
2 0 产品
3 0 信息
7 3 行业信息
4 0 关于(7 行受影响)
-- Author : HappyFlyStone
-- Date : 2009-07-09
-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86)
-- Apr 14 2006 01:12:25
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
--
-------------------------------------------------------------------------- Test Data: ta
IF OBJECT_ID('[ta]') IS NOT NULL
DROP TABLE [ta]
Go
CREATE TABLE ta([id] INT,[tm] NVARCHAR(1),[name] NVARCHAR(4))
Go
INSERT INTO ta
SELECT 1,'0','新闻' UNION ALL
SELECT 2,'0','产品' UNION ALL
SELECT 3,'0','信息' UNION ALL
SELECT 4,'0','关于' UNION ALL
SELECT 5,'1','内部新闻' UNION ALL
SELECT 6,'1','外部新闻' UNION ALL
SELECT 7,'3','行业信息'
GO
--Start
SELECT
*
FROM
TA a
order by case when tm = 0 then id else (select id from ta where id = a.tm) end --Result:
/*
id tm name
----------- ---- ----
1 0 新闻
5 1 内部新闻
6 1 外部新闻
2 0 产品
3 0 信息
7 3 行业信息
4 0 关于(7 行受影响)*/
--End