我需要以特定方式获得树的有序层次结构。有问题的表看起来有点像这样(所有 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
我需要在查询中添加什么来完成此操作?