0

У меня есть рабочая система, которая использует иерархию, образец ниже. Теперь мне нужно, чтобы у ребенка было два родителя, в моем примере мне нужно сделать «помидор» (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 

Спасибо.

+0

Спасибо за исправление форматирования Паули. Надеюсь, этот пример послужит следующим людям, которые придут вместе с подобным вопросом. – Snowy

ответ

1

Иерархия не является вариантом в вашем случае (или, по крайней мере, не является естественным способом сделать это).

Проверьте эту ссылку для traversing hierarchies nodes with multiple parents.