从同一个表中排序项目

时间:2014-04-01 14:40:08

标签: sql-server sorting

我在数据库中对项目进行排序时遇到了这个小问题。

表数据是这样的:

id  | description | parent | rowlevel
100 | item  12222 | -none- | 0
SET | item  12345 | -none- | 0
201 | item  22345 | -SET -  | 1

我想在“id”上输出排序,但也要按照“childen”在“父母”之后的方式排序。

我知道使用不同的表格布局会更容易,但更改不是一个选项。

计划结果将是:

id  | description | parent  | rowlevel
100 | item  12222 | -none-  | 0
SET | item  12345 | -none-  | 0
201 | item  22345 | -SET -  | 1
301 | item  22345 | -SET -  | 1
401 | item  22345 | -SET -  | 1
ST2 | item  12345 | -none-  | 0
211 | item  22345 | -ST2 -  | 1
321 | item  22345 | -ST2 -  | 1
101 | item  22345 | -ST2 -  | 1

我尝试过使用order by但是虽然它的结果是rowlevel 1项,但是item的父结果在底部。和其他父母一起。

我不是使用连接的经验,并且没有线索,如果它可以在表本身上有一个连接来解决这个问题。 我能想到的唯一想法是某种嵌套的SQL查询。 但除此之外,我不确定这是否有效。我也担心这会占用资源并对性能产生很大影响。

2 个答案:

答案 0 :(得分:0)

只要您只有1个级别,只需在SQL中添加以下订单条件:

ORDER BY COALESCE(parent, id), rowlevel

(假设-none-实际上是nullSET / -SET -实际上是某种数字ID。)

如果你有超过1级的嵌套,你将需要某种递归CTE。

答案 1 :(得分:0)

您可以使用recursive CTE

WITH CTE AS
(
    SELECT t1.[id], t1.[description], t1.[parent], 
           [rowlevel]  = 0
    FROM dbo.Table1 t1
    WHERE t1.parent = '-none-'

    UNION ALL

    SELECT t2.[id], t2.[description], t2.[parent], 
           [rowlevel]  = CTE.[rowlevel] + 1
    FROM dbo.Table1 t2 INNER JOIN CTE
        ON t2.parent = CTE.id
)
SELECT * FROM CTE
ORDER BY rowlevel, id

DEMO