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
其实
就是一个父节点(降序),然后下面是子节点(升序)
然后再父节点(降序),然后下面是子节点(升序)

解决方案 »

  1.   

    DECLARE @TB TABLE([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, 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
    */
      

  2.   

    DECLARE @TB TABLE([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, 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
    */
      

  3.   

    --------------------------------------------------------------------------
    --  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 行受影响)
    */