如何使用hierarchyid sql显示所有递归结果

时间:2011-03-30 09:04:17

标签: tsql recursion hierarchyid

我有一张表categories

 ID | NAME                  | PARENT ID    | POSITION   | LEVEL     | ORDER
 ----------------------------------------------------------------------------
 1  | root                  | -1           | 0x         | 0         | 255
 2  | cars                  | 1            | 0x58       | 1         | 10
 5  | trucks                | 1            | 0x68       | 1         | 10
 13 | city cars             | 2            | 0x5AC0     | 2         | 255
 14 | offroad cars          | 2            | 0x5B40     | 2         | 255

其中:

 ID int ident 
 NAME nvarchar(255)
 PARENT ID int
 POSITION hierarchyid
 LEVEL hierarchyid GetLevel()
 ORDER tinyint

此表model指定模型名称及其所属的类别。例如:

 ID  | NAME      | CATEGORY
 -----------------------------
 1   | Civic     | 13
 2   | Pajero    | 14
 3   | 815       | 5
 4   | Avensis   | 13

其中:

 ID int ident
 NAME nvarchar(255)
 CATEGORY int link to ID category table

我要做的是能够展示:

  1. 所有模型 - 将以递归方式显示所有模型,
  2. 类别cars中的模型(包括汽车)
  3. 来自城市汽车(或其子女,如果有的话)的模型
  4. 如何使用hierarchyid进行此类过滤以及如何将表格与模型结合起来?这是如何从一定水平显示所有模型结果的快速方法吗?

2 个答案:

答案 0 :(得分:4)

我相信这会给你你想要的东西:

declare @id hierarchyid

select @id = Position from Categories where Name = 'root' -- or 'cars', 'city cars', etc.

select m.* 
from Models m 
    join Categories c on m.Category = c.ID
where c.Position.IsDescendantOf(@id) = 1

有关IsDescendantOf方法和其他hierarchyid方法的详细信息,请查看method reference

答案 1 :(得分:3)

您将要使用CTE:公用表表达式

http://www.4guysfromrolla.com/webtech/071906-1.shtml

在SQL 2005中引入了允许执行分层或递归关系的简单方法。

这非常接近你的例子:

http://www.sqlservercurry.com/2009/06/simple-family-tree-query-using.html