写一个sql来在树的兄弟之间进行排序

时间:2015-07-08 03:52:35

标签: sql-server

我想写一个t-sql。我有一张原始表格如下。    表:

ID     | ParentId |  Data    |Sortno|
-------|--------- |--------- |------|
1902   |  0       |      210 |1     |
1803   |  0       |      212 |2     |
1604   |  0       |      251 |3     |
1005   |  0       |      256 |4     |
1021   | 1902     |      160 |2     |  
1022   | 1902     |      150 |1     |
19221  | 1022     |      90  |1     |
17222  | 1022     |      80  |2     |
13992  | 1803     |      70  |2     |
13881  | 1803     |      60  |1     |
1522   | 1902     |      150 |3     |

我想对它进行排序并获得如下结果表:

ID     | ParentId| Data  |Sortno|
-------|-------- |-------|------|
1902   |  0      |   210 |1     |
1022   |  1902   |   150 |1     |
19221  |  1022   |   90  |1     |
17222  |  1022   |   80  |2     |
1522   |  1902   |   150 |3     |
1021   |  1902   |   160 |2     |
1803   |  0      |   212 |2     |
13881  | 1803    |   60  |1     |
13992  | 1803    |   70  |2     |
1604   |  0      |   251 |3     |
1005   |  0      |   256 |4     |

如何在兄弟姐妹之间按sortno编写此T-SQL语句顺序?提前谢谢!

2 个答案:

答案 0 :(得分:1)

可能不是正确的方法,但它仍然有效。将ID列转换为Varchar中的Order by对您有用。

CREATE TABLE #sts
  (
     ID       INT,
     ParentId INT,
     Data     INT
  )

INSERT INTO #sts
VALUES      (12,0,210 ),
            (13,0,212 ),
            (14,0,251 ),
            (15,0,256 ),
            (121,12,160 ),
            (122,12,150 ),
            (1221,122,90 ),
            (1222,122,80 ),
            (132,13,70 ),
            (131,13,60 )

SELECT *
FROM   #sts
ORDER  BY Cast(id AS VARCHAR(30)) 

<强>结果

ID      ParentId    Data
12      0           210
121     12          160
122     12          150
1221    122         90
1222    122         80
13      0           212
131     13          60
132     13          70
14      0           251
15      0           256

答案 1 :(得分:1)

SELECT *,DENSE_RANK()OVER(PARENTID ORDER BY ID)作为#STS的SORTNO 按阶段排序(ID为VARCHAR(30))