根据HEAD(父) - sql隔离行

时间:2018-05-30 06:31:38

标签: sql sql-server

我有以下SQL表。

+----+--------+----------+--------+
| ID | TestNo | TestName | HeadID |  
+----+--------+----------+--------+
|  1 |     21 | Comp-1   |  null  |   
|  2 |     22 | C1       |  21    |   
|  3 |     23 | C2       |  21    |   
|  4 |     24 | C3       |  21    |   
|  5 |     47 | Comp-2   |  null  |   
|  6 |     25 | C4       |  47    |   
|  7 |     26 | C1+      |  21    |   
+----+--------+----------+--------+

我希望在他们的头部测试下得到所有子行(根据他们的HeadID)。

select * from ranges order by HeadID

ACTUAL OUPUT 我从以上查询得到:

+----+--------+----------+--------+
| ID | TestNo | TestName | HeadID |  
+----+--------+----------+--------+
|  1 |     21 | Comp-1   |  null  |   
|  5 |     47 | Comp-2   |  null  |   
|  2 |     22 | C1       |  21    |   
|  3 |     23 | C2       |  21    |   
|  4 |     24 | C3       |  21    |   
|  7 |     26 | C1+      |  21    |   
|  6 |     25 | C4       |  47    |   
+----+--------+----------+--------+

但我的渴望的输出是:

+----+--------+----------+--------+
| ID | TestNo | TestName | HeadID |   
+----+--------+----------+--------+
|  1 |     21 | Comp-1   |  null  |   
|  2 |     22 | C1       |  21    |   
|  3 |     23 | C2       |  21    |  
|  4 |     24 | C3       |  21    |   
|  7 |     26 | C1+      |  21    |   
|  5 |     47 | Comp-2   |  null  |  
|  6 |     25 | C4       |  47    |   
+----+--------+----------+--------+

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

如果你只有一个级别的孩子,那么你可以这样订购:

SELECT *
FROM Ranges
ORDER BY
    CASE WHEN HeadID IS NULL THEN TestNo ELSE HeadID END
    ,HeadID
    ,ID
;