0

我有一个使用层次结构的工作系统,示例如下。我现在需要让一个孩子有两个父母,在我的例子中,我需要让 'tomato' (id=4) 既是水果又是蔬菜。

我可以用新的 PK 重构表,然后复制番茄行,这样它的 rowid 可以为n并仍然保留其“番茄标识符”,然后每一行都可以有自己的父级....但是还有另一种方法来指定多个父母无需重组整个表?

DECLARE @hierdest TABLE
    (
      id INT PRIMARY KEY ,
      parentid INT ,
      name VARCHAR(24) ,
      hier HIERARCHYID
    )
DECLARE @hierorig TABLE
    (
      id INT PRIMARY KEY ,
      parentid INT ,
      name VARCHAR(24)
    )
INSERT  INTO @hierorig
        SELECT  1 ,
                0 ,
                'root'
        UNION ALL
        SELECT  2 ,
                1 ,
                'fruit'
        UNION ALL
        SELECT  3 ,
                1 ,
                'vegetable'
        UNION ALL
        SELECT  4 ,
                2 ,
                'tomato'
        UNION ALL
        SELECT  5 ,
                1 ,
                'apple'  
DECLARE @childtemp TABLE
    (
      id INT ,
      parentid INT ,
      num INT
    ) 
INSERT  @childtemp
        ( id ,
          parentid ,
          num 
        )
        SELECT  id ,
                parentid ,
                ROW_NUMBER() OVER ( PARTITION BY parentid ORDER BY parentid )
        FROM    @hierorig;
WITH    paths ( path, id )
          AS ( SELECT   HIERARCHYID::GetRoot() AS hier ,
                        id
               FROM     @childtemp AS c
               WHERE    parentid = 0
               UNION ALL
               SELECT   CAST(p.path.ToString() + CAST(c.num AS VARCHAR(30))
                        + '/' AS HIERARCHYID) ,
                        c.id
               FROM     @childtemp AS c
                        JOIN paths AS p ON c.parentid = p.id
             )
    INSERT  @hierdest
            ( hier ,
              o.id ,
              o.name ,
              o.parentid 
            )
            SELECT  p.path ,
                    o.id ,
                    o.name ,
                    o.parentid
            FROM    @hierorig AS o
                    JOIN paths AS p ON o.id = p.id

DECLARE @vertcurrent HIERARCHYID = ( SELECT hier
                                     FROM   @hierdest
                                     WHERE  id = 1
                                   )
SELECT  hier.ToString() AS hiernode ,
        *
FROM    @hierdest
WHERE   hier.IsDescendantOf(@vertcurrent) = 1
ORDER BY hier

谢谢。

4

1 回答 1

1

HierarchyId 在您的情况下不是一个选项(或者至少不是一种自然的方式)。

检查此链接以遍历具有多个父级的层次结构节点

于 2014-02-07T19:31:59.857 回答