sql由多个字段组成的复杂顺序

时间:2016-05-20 12:11:40

标签: sql sql-server

我有一个table类别,其int字段可以引用同一个表中的primary key

像这样:

ID category         isSubCategoryOf orderingNumber
3  "red t-shirts"         2              2 
1  "clothes"             NULL            1
4  "cars"                NULL            1
6  "Baby toys"            5              1
5  "Toys"                NULL            1
2  "t-shirt"              1              1

我希望table为订单,以便在每个类别下列出所有子类别,并在该类别下列出所有子类别。

ID category         isSubCategoryOf orderingNumber
1  "clothes"             NULL            1
2  "t-shirt"              1              1
3  "red t-shirts"         2              2 
4  "cars"                NULL            1
5  "Toys"                NULL            1
6  "Baby toys"            5              1

是否可以使用SQL这样做,或者我必须手动订购?

2 个答案:

答案 0 :(得分:4)

我理解您的需求,您需要一个递归查询来处理您的分层数据:

WITH recCTE AS
(

    --recursive seed
    SELECT 
        category,
        ID,
        isSubCategoryOf as ParentID,
        orderingNumber,
        CAST(ID as VARCHAR(100)) as Path,
        1 as depth
    FROM table
    WHERE isSubCategoryOf IS NULL

    UNION ALL

    --recursive term
    SELECT
        table.category,
        table.id,
        table.isSubCategoryOf,
        table.orderingNumber,
        recCTE.path + '>' + table.id,
        recCTE.depth + 1
    FROM recCTE
        INNER JOIN table ON
            recCTE.ID = table.isSubCategoryOf
)

SELECT * FROM recCTE ORDER BY path

递归查询由三部分组成。

  1. 递归种子,它是递归查找的起点。在你的情况下,它是任何带有isSubCategoryOf的记录。您可以将这些视为层次结构的根。

  2. 递归术语,它是引用回自身的递归CTE的一部分。它会迭代,直到它没有为层次结构的每个分支创建记录

  3. 从递归CTE中选择的最终Select语句。

  4. 在这里,我创建了一个路径字段,将每个ID作为hieararchy的一部分拼接在一起。这为您提供了可以排序的字段,以便按要求进行分层排序。

    看来,对于您的数据,您的orderingNumber类似于我在上面的递归CTE中添加的depth字段。如果是这种情况,那么您可以从CTE中删除该字段并保存一些处理。

答案 1 :(得分:0)

如果你只是想要sotrt和打印,你可以制作计算列

select ID, category, isSubCategoryOf, orderingNumber, ID + '_' + isSubCategoryOf as SortOrder
    from table
    order by ID + '_' + isSubCategoryOf