У меня есть рабочая система, которая использует иерархию, образец ниже. Теперь мне нужно, чтобы у ребенка было два родителя, в моем примере мне нужно сделать «помидор» (id = 4) как фруктами, так и овощами.Иерархия SQL Server 2012 с двумя родителями?
я мог бы реструктурировать таблицу с новым ПК, а затем дублировать томатную строку, так что может иметь 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
Спасибо.
Спасибо за исправление форматирования Паули. Надеюсь, этот пример послужит следующим людям, которые придут вместе с подобным вопросом. – Snowy