Как показать все рекурсивные результаты с иерархией SQL - PullRequest
3 голосов
/ 30 марта 2011

У меня есть таблица 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. модели из городских автомобилей (или их детей, если таковые имеются)

Как использовать иерархию для такой фильтрации и как объединить таблицу для результатов с моделями? Это быстрый способ показать все результаты модели с определенного уровня?

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Я считаю, что это дало бы вам то, что вы искали:

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 методах, обратитесь к справке по методу .

3 голосов
/ 31 марта 2011

Вы захотите использовать CTE: общее табличное выражение

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

Введенный в SQL 2005 позволяет легко создавать иерархические или рекурсивные отношения.

Это довольно близко к вашему примеру:

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

...