我需要以特定方式获得树的有序层次结构。有问题的表看起来有点像这样(所有 ID 字段都是唯一标识符,为了举例,我已经简化了数据):
EstimateItemID EstimateID ParentEstimateItemID ItemType
-------------- ---------- -------- ------ --
1 一个空产品
2个1个产品
3一2服务
4 空产品
5一4产品
6一5服务
7一1服务
8一4产品
树结构的图形视图(* 表示“服务”):
一个
___/ \___
/ \
1 4
/ \ / \
2 7* 5 8
//
3* 6*
使用这个查询,我可以得到层次结构(假装'A'是一个唯一标识符,我知道它不在现实生活中):
DECLARE @EstimateID uniqueidentifier
SELECT @EstimateID = 'A'
;WITH temp as(
SELECT * FROM EstimateItem
WHERE EstimateID = @EstimateID
UNION ALL
SELECT ei.* FROM EstimateItem ei
INNER JOIN temp x ON ei.ParentEstimateItemID = x.EstimateItemID
)
SELECT * FROM temp
这给了我 EstimateID 'A' 的孩子,但是按照它出现在表格中的顺序。IE:
估计物品 ID
--------------
1
2
3
4
5
6
7
8
不幸的是,我需要的是一个有序的层次结构,其结果集遵循以下约束:
1.每个分支都要分组 2. ItemType 'product' 和 parent 的记录是顶部节点 3. 具有 ItemType 'product' 和非 NULL 父级的记录分组在顶部节点之后 4. ItemType 'service' 的记录是分支的底部节点
因此,在此示例中,我需要结果的顺序是:
估计物品 ID
--------------
1
2
3
7
4
5
8
6
我需要在查询中添加什么来完成此操作?