Нужно получить список потомков в хранимой процедуре - PullRequest
0 голосов
/ 09 ноября 2011

Описание:

Существует таблица, состоящая из двух столбцов (ParentId и ChildId), которая отображает иерархию некоторых объектов.Каждый идентификатор может быть представлен в столбце ParentId только один раз.Это означает, что у каждого объекта есть только один дочерний объект.

Проблема: Мне нужно проверить, есть ли сущность (ее Id) в списке потомков родительской сущности.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011
DECLARE @parentId INT
DECLARE @childId INT
DECLARE @targetChildId INT
SET @targetChildId=<put id of a child you want to find>
SET @parentId=<put id of a parent you are looking child for>
SET @childId=0

WHILE (@childId<>@targetChildId)
    BEGIN
        IF(EXISTS(SELECT ChildId FROM Hierarchies WHERE ParentId=@parentId))
        BEGIN
            SET @childId=(SELECT ChildId FROM Hierarchies WHERE ParentId=@parentId)
            SET @parentId=@childId
        END 
        ELSE
        BEGIN
            SET @childId=0
            BREAK
        END
    END
PRINT @childId

Возвращает 0, если целевой родитель не найден в целевом родителе.

1 голос
/ 10 ноября 2011

Пример данных:

CREATE TABLE [dbo].[EntityHierarchy]
(
    [EntityId] INT,
    [ChildEntityId] INT
)

INSERT  [dbo].[EntityHierarchy]
VALUES  (1, 2),
        (2, 3),
        (3, 4),
        (4, 1) -- Cycle

Найти круговые отношения:

DECLARE @SearchEntityId INT = 1

;WITH [cteRursive] AS
(
    SELECT  1 AS [ROW_NUMBER],
            [ChildEntityId] AS [EntityId]
    FROM [dbo].[EntityHierarchy]
    WHERE [EntityId] = @SearchEntityId
    UNION ALL
    SELECT  r.[ROW_NUMBER] + 1,
            h.[ChildEntityId]
    FROM [cteRursive] r
    INNER JOIN [dbo].[EntityHierarchy] h 
        ON r.[EntityId] = h.[EntityId]
    WHERE h.[ChildEntityId] <> @SearchEntityId
)
SELECT h.*
FROM [cteRursive] r
INNER JOIN [dbo].[EntityHierarchy] h 
    ON r.[EntityId] = h.[EntityId]
WHERE r.[ROW_NUMBER] = (SELECT MAX([ROW_NUMBER]) FROM [cteRursive])

Я использую рекурсивный CTE , чтобы перечислить потомков. дочерний элемент последнего потомка либо создает цикл, либо нет.

...