我有以下嵌套集
这导致了这棵树
1 -
|---- 2 -
| |---- 4 -
| |---- 7
| |---- 8
|----10 -
|---- 9
3 -
|---- 5
|---- 6
13-
|---- 11
|---- 12
我有一个产品列表 SELECT Id, Name ... FROM Products
与类别的多对多关系。所有类别都可以有促销。好的,现在的问题。
假设我在类别 7、8、6 中有一个 ProductX。以及类别 1、2、3 中的促销活动。我需要找到最近的父母,每个类别都有促销活动,或者直到没有更多父母为止。
最终结果应该是
CategoryId PromotionPrice
2 price...
3 price...
我有的
WITH Promotions (CategoryId, PromotionPrice)
{
SELECT CategoryId, PromotionPrice
FROM Promotions
}
SELECT CategoryId, PromotionPrice
FROM NestedSet s1
LEFT JOIN NestedSet s2 ON s1.ParentId = s2.Id
LEFT JOIN Promotions p ON s1.CategoryId = p.CategoryId
然后获得 Better Promotion(我知道该怎么做)并应用于主查询 SELECT * FROM Products; 对于每个产品(所以只是一个简单的连接)。
我的问题是我知道我需要使用(或者我认为我需要使用)递归 CTE,但我不知道该怎么做。因为它应该只对每一行递归,并且只在它找到该行的提升之前。
编辑(我将尝试解释逻辑)。
ProductId CategoryId
1 7
1 8
1 6
此产品有 2 个直系父母:4(来自 7 和 8)和 3(来自 6)我在 CategoryIds 中有促销:1、2、3。第一轮查询结果
CategoryId ParentId PromotionPrice
7 4 NULL
8 4 NULL
6 3 10
重要的是 ParentId 所以我可以 GroupBy ParentId 结果将是
CategoryId PromotionPrice
4 NULL
3 10
好的,因为promotionPrice 是NULL 我需要去他的父母(在这种情况下2)所以上面的查询需要返回
CategoryId ParentId PromotionPrice
4 2 NULL
3 NULL 10
由于 PromotionPrice 是 Null 我必须检查 Category2 是否有 Promotion 所以结果将是
CategoryId ParentId PromotionPrice
2 1 15
3 NULL 10
它停在那里。如果我从 Category2 中删除了促销,它应该再进行一轮:
CategoryId ParentId PromotionPrice
1 NULL 5
3 NULL 10
在这一点上,由于没有更多的父母,PromotionPrice 是否为空都没有关系。问题是我需要一直努力寻找升职。
当我查看 SortPath 已经拥有所有信息时,只需将其分解并递归地倒退直到找到具有促销的 ID,但我仍然不知道如何实现这一点。
希望这有助于解释一下。