如何在层次结构中查找行

时间:2012-05-17 14:47:52

标签: sql join sql-server-2008-r2 hierarchy hierarchyid

我正在尝试检查特定ID是否可以位于层次结构中。

我有一个以分层方式存储的类别列表。 实施例

(0x,       0, 1,  'root'),
(0x58,     1, 2,  'Market Zone'),
(0x5AC0,   2, 3,  'Informática'),
(0x5AD6,   3, 8,  'Accesorios Robótica'),
(0x5ADA,   3, 9,  'Accesorios Eléctricos'),
(0x5ADE,   3, 10, 'Equipos'),
(0x5ADEB0, 4, 12, 'Portátiles'),
(0x5ADED0, 4, 11, 'Accesorios Portátil'),
(0x5ADEF0, 4, 13, 'Máquinas de Oficina'),
(0x5ADF08, 4, 14, 'PC y TPV'),
(0x5ADF18, 4, 15, 'Accesorios PC y TPV'),
(0x5ADF28, 4, 16, 'Servidores'),
(0x5AE1,   3, 17, 'Iluminación'),
(0x5AE3,   3, 18, 'Periféricos - Informática'),
(0x5AE358, 4, 41, 'Cajas Externas')

items表有一个链接到该项所属类别的字段。我想要实现的是(仅按级别)列出具有项目的“分支”类别。

我希望这次显而易见。

感谢您的帮助。

P.S。:关于西班牙语描述符,请给我说,但应用程序是西班牙语

3 个答案:

答案 0 :(得分:0)

在Oracle中,您可以使用CONNECT_BY_ROOT运算符仅显示根元素。您可能还需要在外部查询中使用DISTINCT

答案 1 :(得分:0)

尝试:

DECLARE @CategoryId INT
SET @CategoryId = 23;

WITH Category_CTE (CategoryId, ParentId, Lvl) AS 
(
    SELECT CategoryId, ParentId, 1 lvl
    FROM Category
    WHERE CategoryId = @CategoryId
UNION ALL
    SELECT c.CategoryId, c.ParentId, Lvl+1 lvl
    FROM Category c
    INNER JOIN Category_CTE cte ON cte.ParentId = c.CategoryId
)
SELECT *
FROM Category_CTE
ORDER BY Lvl DESC

以上查询将返回结果:

CategoryId  ParentId    Lvl
----------- ----------- -----------
0           NULL        4
2           0           3
21          2           2
23          21          1

类别表数据:

CategoryId  ParentId    CategoryName
----------- ----------- ------------
0           NULL        Category 1
1           0           Category 2
12          1           Category 3
13          1           Category 4
2           0           NULL
21          2           NULL
23          21          NULL

答案 2 :(得分:0)

根据你的例子,以下是诀窍:

Select left(category, 3)
 From categoryTree
Where right(category, 2) in ('17', '23')

我会使用like或charindex使这更通用,但我在我的iPhone上。输入代码很痛苦。