Рекурсивно захватить все данные на основе родительского идентификатора - PullRequest
0 голосов
/ 15 сентября 2010

У нас есть таблица, в которой строки рекурсивно связаны с другой строкой. Я хочу получить данные, связанные с данным parentId и всеми его детьми. Где parentId - один из корневой строки.

Я думал, что видел или делал что-то подобное раньше, но я не могу найти это сейчас. Это можно сделать в SQL или лучше в коде?

Я хочу, чтобы список выглядел так, когда я закончу:

  • Родитель
    • Дети
      • Внук

1 Ответ

1 голос
/ 15 сентября 2010

Это можно сделать в SQL Server 2005 и более поздних версиях с помощью выражений общих таблиц (CTE). Вот отличная ссылка из MSDN, описывающая рекурсивные запросы: Рекурсивные запросы с использованием общих табличных выражений

Вот пример:

Если вы представляете иерархическую линию людей, этот запрос позволит вам увидеть полную линию любого человека И вычислить его место в иерархии. Его можно изменить, чтобы найти любые дочерние отношения.

Вместо идентификатора человека вы меняете идентификатор строки, которую используете в качестве родителя.

--Create table of dummy data
create table #person (
personID integer IDENTITY(1,1) NOT NULL,
name      varchar(255) not null,
dob       date,
father    integer
);

INSERT INTO #person(name,dob,father)Values('Pops','1900/1/1',NULL);  
INSERT INTO #person(name,dob,father)Values('Grandma','1903/2/4',null);
INSERT INTO #person(name,dob,father)Values('Dad','1925/4/2',1);
INSERT INTO #person(name,dob,father)Values('Uncle Kev','1927/3/3',1);
INSERT INTO #person(name,dob,father)Values('Cuz Dave','1953/7/8',4);
INSERT INTO #person(name,dob,father)Values('Billy','1954/8/1',3);

DECLARE @OldestPerson INT; 
SET @OldestPerson = 1; -- Set this value to the ID of the oldest person in the family

WITH PersonHierarchy (personID,Name,dob,father, HierarchyLevel) AS
(
   SELECT
      personID
      ,Name
      ,dob
      ,father,
      1 as HierarchyLevel
   FROM #person
   WHERE personID = @OldestPerson

   UNION ALL

   SELECT
    e.personID,
      e.Name,
      e.dob,
      e.father,
      eh.HierarchyLevel + 1 AS HierarchyLevel
   FROM #person e
      INNER JOIN PersonHierarchy eh ON
         e.father = eh.personID
)

SELECT *
FROM PersonHierarchy
ORDER BY HierarchyLevel, father;

DROP TABLE #person;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...