递归地根据父ID获取所有数据

时间:2010-09-14 21:06:37

标签: sql-server-2005 recursion sql

我们有一个表,其中行以递归方式链接到另一行。我想拉取与给定parentId及其所有子节点相关联的数据。其中parentId是根行中的一个。

我以为我之前已经看过或做过类似的事情,但我现在无法找到它。这可以在SQL中完成,还是在代码中更好?

当我完成时,我希望列表看起来像这样:

      • 孙子

1 个答案:

答案 0 :(得分:1)

这可以使用公用表表达式(CTE)在SQL Server 2005及更高版本中完成。以下是来自MSDN的一个很棒的链接,用于描述递归查询:Recursive Queries Using Common Table Expressions

以下是一个例子:

如果您想象一个人的等级线,此查询将让您查看任何人的完整行并计算他们在层次结构中的位置。可以对其进行修改以找到任何子关系。

您可以将您用作父母的行的ID替换为此人的ID。

--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;