【问题标题】:How to locate row within a hierarchy如何在层次结构中定位行
【发布时间】:2012-05-17 14:47:51
【问题描述】:

我正在尝试检查特定 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.:请原谅我关于西班牙语描述符,但应用程序是西班牙语的

【问题讨论】:

  • 您能告诉我们您使用的是哪个数据库吗?
  • MS SQL Server R2(抱歉错过了)
  • 我正在重新提出问题,可能还不够清楚

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    试试:

    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
    

    【讨论】:

      【解决方案3】:

      根据您的示例,以下方法可以解决问题:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-31
        相关资源
        最近更新 更多