SQL Server:具有优先级的CTE树

时间:2016-02-26 17:02:09

标签: sql sql-server common-table-expression

我在如何为SQL Server中的递归父子树构建查询时遇到了一些麻烦。

我找到了一些常用的表表达式,但是我必须考虑另一个参数(每个级别的优先级),这是我在互联网上搜索时找不到的,所以我的表格结构就像这样

id - parentid - proprity

例如,如果我有这些数据:

1 - NULL - 2
2 - NULL - 1
3 - 2 - 2
4 - 3 - 1
5 - 2 - 0
6 - 1 - 0
7 - 2 - 3

查询必须按正确顺序返回:

-2
--5
--3
---4
--7
-1
--6

此列表也是可订购的,因此如果任何订单发生变化,我必须在正确的位置重置优先级。任何人都已经在SQL Server中使用查询解决了这种情况吗?

提前致谢

2 个答案:

答案 0 :(得分:0)

这将为您提供所需的订单。就个人而言,我尝试在显示层中进行排序,但这将在SQL中进行。

这取决于一位数的优先级值。如果那些可能更大,那么您需要将前导0添加到优先级,例如:RIGHT('0' + priority, 2)

查询只是在每个点构建一个优先级字符串,以便您可以在其中进行排序。

;WITH Hierarchy_CTE AS
(
    SELECT
        id,
        parent_id,
        CAST([priority] AS VARCHAR(100)) AS priority_string,
        id AS base,
        1 AS lvl
    FROM
        My_Table
    WHERE
        parent_id IS NULL
    UNION ALL
    SELECT
        MT.id,
        MT.parent_id,
        CAST(H.priority_string + CAST(MT.priority AS VARCHAR(20)) AS VARCHAR(100)),
        H.base,
        H.lvl + 1
    FROM
        Hierarchy_CTE H
    INNER JOIN My_Table MT ON MT.parent_id = H.id
)
SELECT
    id,
    base,
    lvl
FROM
    Hierarchy_CTE
ORDER BY
    priority_string

答案 1 :(得分:0)

似乎这个解决方案正在起作用(摘自Tom H回答):

reference.conf

我添加了填充零等于固定长度减去然后"字符串化"优先级长度和id,所以我可以将它们命令为优先级,然后为id。 此解决方案仅适用于升序(不适用于维护树视图的降序),但只有当我必须保存更新的优先级时,此列表才对我有用,因此可能就足够了。