Мне нужно получить упорядоченную иерархию дерева определенным образом. Соответствующая таблица выглядит примерно так (все поля ID являются уникальными идентификаторами, я упростил данные для примера):
EstimateItemID EstimateID ParentEstimateItemID ItemType -------------- ---------- -------------------- -------- 1 A NULL product 2 A 1 product 3 A 2 service 4 A NULL product 5 A 4 product 6 A 5 service 7 A 1 service 8 A 4 product
Графический вид древовидной структуры (* обозначает "сервис" ):
A ___/ \___ / \ 1 4 / \ / \ 2 7* 5 8 / / 3* 6*
Используя этот запрос, я могу получить иерархию (просто притворись, что "А" является уникальным идентификатором, я знаю, что это не в реальной жизни):
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', но в том порядке, в котором он отображается в таблице. то есть:
EstimateItemID -------------- 1 2 3 4 5 6 7 8
К сожалению, мне нужна упорядоченная иерархия с набором результатов, который следует за следующими ограничениями:
1. each branch must be grouped 2. records with ItemType 'product' and parent are the top node 3. records with ItemType 'product' and non-NULL parent grouped after top node 4. records with ItemType 'service' are bottom node of a branch
Итак, порядок, в котором мне нужны результаты, в этом примере:
EstimateItemID -------------- 1 2 3 7 4 5 8 6
Что мне нужно добавить к моему запросу для выполнения этого?