我在如何为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中使用查询解决了这种情况吗?
提前致谢
答案 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。 此解决方案仅适用于升序(不适用于维护树视图的降序),但只有当我必须保存更新的优先级时,此列表才对我有用,因此可能就足够了。