Id parentId
17 16
16 0
15 0
14 1
13 6
12 8
11 1
10 2
9 1
8 0
7 0
6 0
5 1
4 2
3 1
2 0
1 0
parentId为父节点,不为0的是子节点
最终想输出ID的顺序为16,17,15,8,12,7,6,13,2,4,10,1,3,5,9,11,14
其实
就是一个父节点(降序),然后下面是子节点(升序)
然后再父节点(降序),然后下面是子节点(升序)
17 16
16 0
15 0
14 1
13 6
12 8
11 1
10 2
9 1
8 0
7 0
6 0
5 1
4 2
3 1
2 0
1 0
parentId为父节点,不为0的是子节点
最终想输出ID的顺序为16,17,15,8,12,7,6,13,2,4,10,1,3,5,9,11,14
其实
就是一个父节点(降序),然后下面是子节点(升序)
然后再父节点(降序),然后下面是子节点(升序)
INSERT @TB
SELECT 17, 16 UNION ALL
SELECT 16, 0 UNION ALL
SELECT 15, 0 UNION ALL
SELECT 14, 1 UNION ALL
SELECT 13, 6 UNION ALL
SELECT 12, 8 UNION ALL
SELECT 11, 1 UNION ALL
SELECT 10, 2 UNION ALL
SELECT 9, 1 UNION ALL
SELECT 8, 0 UNION ALL
SELECT 7, 0 UNION ALL
SELECT 6, 0 UNION ALL
SELECT 5, 1 UNION ALL
SELECT 4, 2 UNION ALL
SELECT 3, 1 UNION ALL
SELECT 2, 0 UNION ALL
SELECT 1, 0DECLARE @STR VARCHAR(MAX)
SET @STR='';WITH CTE AS
(
SELECT *,ID AS GRP FROM @TB WHERE [parentId]=0
UNION ALL
SELECT T.*,CTE.ID FROM @TB AS T JOIN CTE ON T.[parentId]=CTE.ID
)
SELECT @STR=@STR+','+RTRIM(ID)
FROM CTE
ORDER BY GRP DESC,[parentId],IDSELECT STUFF(@STR,1,1,'')
/*
16,17,15,8,12,7,6,13,2,4,10,1,3,5,9,11,14
*/
INSERT @TB
SELECT 17, 16 UNION ALL
SELECT 16, 0 UNION ALL
SELECT 15, 0 UNION ALL
SELECT 14, 1 UNION ALL
SELECT 13, 6 UNION ALL
SELECT 12, 8 UNION ALL
SELECT 11, 1 UNION ALL
SELECT 10, 2 UNION ALL
SELECT 9, 1 UNION ALL
SELECT 8, 0 UNION ALL
SELECT 7, 0 UNION ALL
SELECT 6, 0 UNION ALL
SELECT 5, 1 UNION ALL
SELECT 4, 2 UNION ALL
SELECT 3, 1 UNION ALL
SELECT 2, 0 UNION ALL
SELECT 1, 0DECLARE @STR VARCHAR(MAX)
SET @STR='';WITH CTE AS
(
SELECT *,ID AS GRP FROM @TB WHERE [parentId]=0
UNION ALL
SELECT T.*,CTE.ID FROM @TB AS T JOIN CTE ON T.[parentId]=CTE.ID
)
SELECT @STR=@STR+','+RTRIM(ID)
FROM CTE
ORDER BY GRP DESC,[parentId],IDSELECT STUFF(@STR,1,1,'')
/*
16,17,15,8,12,7,6,13,2,4,10,1,3,5,9,11,14
*/
-- Author : htl258(Tony)
-- Date : 2010-04-08 18:08:19
-- Version:Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
-- Mar 29 2009 10:27:29
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
--------------------------------------------------------------------------
--> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([Id] INT,[parentId] INT)
INSERT [tb]
SELECT 17,16 UNION ALL
SELECT 16,0 UNION ALL
SELECT 15,0 UNION ALL
SELECT 14,1 UNION ALL
SELECT 13,6 UNION ALL
SELECT 12,8 UNION ALL
SELECT 11,1 UNION ALL
SELECT 10,2 UNION ALL
SELECT 9,1 UNION ALL
SELECT 8,0 UNION ALL
SELECT 7,0 UNION ALL
SELECT 6,0 UNION ALL
SELECT 5,1 UNION ALL
SELECT 4,2 UNION ALL
SELECT 3,1 UNION ALL
SELECT 2,0 UNION ALL
SELECT 1,0
GO
--SELECT * FROM [tb]-->SQL查询如下:;WITH T AS
(
SELECT *,PX=ID FROM TB T
WHERE NOT EXISTS(SELECT 1 FROM TB WHERE [ID]=T.[PARENTID])
UNION ALL
SELECT A.*,B.ID FROM TB AS A
JOIN T B ON A.[PARENTID]=B.ID
)
SELECT STUFF((SELECT ','+LTRIM(ID) FROM T
ORDER BY PX DESC,[PARENTID],ID FOR XML PATH('')),1,1,'') AS IDLIST
/*
16,17,15,8,12,7,6,13,2,4,10,1,3,5,9,11,14(1 行受影响)
*/