首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带双亲的Server 2012 HierarchyId?

带双亲的Server 2012 HierarchyId?
EN

Stack Overflow用户
提问于 2014-02-07 15:40:12
回答 1查看 1.3K关注 0票数 0

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

我可以用一个新的PK重新构造表,然后复制番茄行,这样它就可以有n的rowid,并且保留它的“番茄标识符”,然后每一行都可以有自己的父.但是,是否有另一种方法可以指定多个父母而不对整个表进行重组?

代码语言:javascript
复制
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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-07 19:31:59

在您的情况下,HierarchyId不是一种选择(或者至少不是一种自然的方法)。

查看此链接以获得遍历具有多个父节点的层次节点

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21631853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档