Иерархическая структура с каждым идентификатором узла - PullRequest
1 голос
/ 10 июля 2019

У меня есть рекурсивная таблица базы данных и иерархическое представление всех данных таблицы

CREATE VIEW dbo.vw_hierarchicalView
AS
    WITH hView (Id,
                    IdParent,
                    Level)
    AS
    (
        SELECT tableParent.Id,
               tableParent.IdParent,
               1 AS Level
        FROM dbo.vw_ComplaintWithStatus tableParent
        WHERE tableParent.IdParent IS NULL
        UNION ALL SELECT tableChild.Id,
                         tableChild.IdParent,
                         hw.level + 1 AS  Level
                 FROM dbo.vw_ComplaintWithStatus tableChild
                      INNER JOIN hView hw ON  tableChild.IdParent = hw.Id
    )
    SELECT final.Id,
           final.IdParent,
           ISNULL(final.Level, 1) AS Level
    FROM hView final

Результатом этого представления является следующая таблица: Result of view

Мне нужно, чтобы каждый корневой уровень имел свой уникальный идентификатор и этот идентификатор для копирования дочерним элементам. желаемый результат таков:

Desired result

Возможно ли это? Спасибо за ваш совет и помощь.

http://sqlfiddle.com/#!18/8400c/3

    CREATE TABLE Entries
(
  ID BIGINT NOT NULL PRIMARY KEY,
  ENTRY NVARCHAR(MAX) NOT NULL,
  PARENT_ID BIGINT NULL FOREIGN KEY REFERENCES Entries (ID)
)

INSERT INTO ENTRIES(ID, ENTRY, PARENT_ID) VALUES (1, 'TEXT', NULL)
INSERT INTO ENTRIES(ID, ENTRY, PARENT_ID) VALUES (2, 'TEXT', 1)
INSERT INTO ENTRIES(ID, ENTRY, PARENT_ID) VALUES (3, 'TEXT', 2)
INSERT INTO ENTRIES(ID, ENTRY, PARENT_ID) VALUES (4, 'TEXT', NULL)
INSERT INTO ENTRIES(ID, ENTRY, PARENT_ID) VALUES (5, 'TEXT', 4)
INSERT INTO ENTRIES(ID, ENTRY, PARENT_ID) VALUES (6, 'TEXT', 4)
INSERT INTO ENTRIES(ID, ENTRY, PARENT_ID) VALUES (7, 'TEXT', 6)
INSERT INTO ENTRIES(ID, ENTRY, PARENT_ID) VALUES (8, 'TEXT', NULL)
INSERT INTO ENTRIES(ID, ENTRY, PARENT_ID) VALUES (9, 'TEXT', 1)

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Вы можете иметь номер строки () в части привязки и иметь то же значение для дочерних элементов в рекурсивной части

WITH hView (Id,
                IdParent,
                Level,node)
    AS
    (
        SELECT tableParent.Id,
               tableParent.Parent_Id,
               1 AS Level,
            row_number()over (order by id)   AS  node
        FROM Entries tableParent
        WHERE tableParent.Parent_Id IS NULL
        UNION ALL 
        SELECT tableChild.Id,
               tableChild.Parent_Id,
               hw.level + 1 AS  Level,
                hw.node  AS  node
        FROM dbo.Entries tableChild
             INNER JOIN hView hw ON  tableChild.Parent_Id = hw.Id
    )
    SELECT final.Id,
           final.IdParent,
           ISNULL(final.Level, 1) AS Level
           , node
    FROM hView final
    order by node
2 голосов
/ 10 июля 2019

Если вы добавите дополнительный столбец в свой рекурсивный CTE для корневого узла, вы можете получить DENSE_RANK для номера узла:

WITH rCTE AS(
    SELECT E.ID AS Id,
           E.PARENT_ID AS IdParent,
           1 AS [Level],
           E.ID AS RootID
    FROM dbo.Entries E
    WHERE E.PARENT_ID IS NULL
    UNION ALL
    SELECT E.ID AS Id,
           E.PARENT_ID AS IdParent,
           r.[Level] + 1 AS [Level],
           r.RootID
    FROM rCTE r
         JOIN dbo.Entries E ON r.ID = E.PARENT_ID)
SELECT r.Id,
       r.IdParent,
       r.Level,
       DENSE_RANK() OVER (ORDER BY r.RootID) AS [Node]
FROM rCTe r;
...