我有一个使用层次结构的工作系统,示例如下所示。我现在需要让一个孩子有两个父母,在我的例子中,我需要做‘番茄’(id=4) --既是水果又是蔬菜。
我可以用一个新的PK重新构造表,然后复制番茄行,这样它就可以有n的rowid,并且保留它的“番茄标识符”,然后每一行都可以有自己的父.但是,是否有另一种方法可以指定多个父母而不对整个表进行重组?
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谢谢。
发布于 2014-02-07 19:31:59
在您的情况下,HierarchyId不是一种选择(或者至少不是一种自然的方法)。
查看此链接以获得遍历具有多个父节点的层次节点。
https://stackoverflow.com/questions/21631853
复制相似问题