代码之家  ›  专栏  ›  技术社区  ›  Mike Wills

基于父id递归地获取所有数据

  •  0
  • Mike Wills  · 技术社区  · 14 年前

    我们有一个表,其中行递归地链接到另一行。我想提取与给定parentId及其所有子项相关的数据。其中parentId是根行中的一个。

    我以为我以前见过或做过这样的事,但现在找不到了。这可以在SQL中完成还是在代码中完成更好?

    当我完成后,我希望列表如下所示:

    • 起源
        • 孙子
    1 回复  |  直到 14 年前
        1
  •  1
  •   NakedBrunch    14 年前

    这可以在SQLServer2005和更高版本中使用公共表表达式(CTE)来完成。下面是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;