3

我有一张桌子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. 来自城市汽车的模型(或其孩子,如果有的话)

如何使用 hierarchyid 进行此类过滤以及如何将结果表与模型连接起来?这是如何从某个级别显示所有模型结果的快速方法吗?

4

2 回答 2

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方法的更多信息,请查看方法参考

于 2011-09-15T01:31:42.653 回答
3

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

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

SQL 2005 中引入的允许一种简单的方法来处理层次或递归关系。

这与您的示例非常接近:

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

于 2011-03-30T22:19:46.227 回答