Question

I have a table 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

where:

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

This table model specifies model name and category where it belongs. Example:

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

where:

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

What I am trying to do is to be able to show:

  1. all models - would show all models from root recursively,
  2. models within category cars (cars included)
  3. models from city cars (or its children if any)

How do I use hierarchyid for such filtering and how to join the table for results with models? Is that a quick way how to show all model results from certain level?

Was it helpful?

Solution

You going to want to use a CTE: Common Table Expression

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

Introduced in SQL 2005 the allow for an easy way to do hierarchic or recursive relationships.

This is pretty close to your example:

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

OTHER TIPS

I believe this would have given you what you were looking for:

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

For more information on the IsDescendantOf method and other hierarchyid methods, check the method reference.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top