的最深层次我使用SQLServer的2008年如何获得分层SQL查询
说我有一个递归层次结构表,SalesRegion,白衣SalesRegionId和ParentSalesRegionId。我需要的是,给定一个特定的SalesRegion(层次结构中的任何位置),检索BOTTOM级别的所有记录。
IE: SalesRegion,ParentSalesRegionId
1,空
1-1,1
1-2,1
1-1-1 1-1
1-1-2,1-1
1-2-1,1-2
1-2-2,1-2
1-1-1-1,1-1-1
1-1-1-2,1-1-1
1-1-2-1,1-1-2
1-2-1-1,1-2-1
(在我的表我有序贯号码,这个虚线数字只清除)
因此,如果用户输入1-1,我需要使用SalesRegion 1-1-1-1或1-1-1-2或1-1-2-1(而不是1-2-2-2)检索al记录)。同样,如果用户输入1-1-2-1,我需要检索只是1-1-2-1
我有一个CTE查询检索1-1以下的所有内容,但包括我不喜欢的行'不想要:
WITH SaleLocale_CTE AS (
SELECT SL.SaleLocaleId, SL.SaleLocaleName, SL.AccountingLocationID, SL.LocaleTypeId, SL.ParentSaleLocaleId, 1 AS Level /*Added as a workaround*/
FROM SaleLocale SL
WHERE SL.Deleted = 0
AND (@SaleLocaleId IS NULL OR SaleLocaleId = @SaleLocaleId)
UNION ALL
SELECT SL.SaleLocaleId, SL.SaleLocaleName, SL.AccountingLocationID, SL.LocaleTypeId, SL.ParentSaleLocaleId, Level + 1 AS Level
FROM SaleLocale SL
INNER JOIN SaleLocale_CTE SLCTE ON SLCTE.SaleLocaleId = SL.ParentSaleLocaleId
WHERE SL.Deleted = 0
)
SELECT *
FROM SaleLocale_CTE
在此先感谢!
亚历杭德罗。
是否有最大深度4?如果是这样,那么这也是任何分支的最小最终深度? – 2012-02-09 22:09:49
@Norla Nope,层数的最大数目是未知的......但我确实需要最后一层的任何东西,我会编辑这个问题来说明问题。谢谢! – 2012-02-09 22:13:35
如果*您有调整结构的奢侈*,您可能需要考虑HierarchyID数据类型。它使这样的查询变得简单(并且通常更快)。类似于'select ... from SL where myHierarchy.IsDecendantOf(@value)'或myHerarchyID.GetDescendant(@ child1,@ child2)。 – EBarr 2012-02-09 22:24:23