【问题标题】:Recursively grab all data based on a parent id基于父ID递归抓取所有数据
【发布时间】:2011-04-12 09:24:29
【问题描述】:

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

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

我希望完成后列表看起来像这样:

  • 父母
    • 孩子
      • 孙子

【问题讨论】:

  • 您使用的是什么数据库和版本?并非所有数据库都支持递归查询。

标签: sql-server-2005 recursion sql


【解决方案1】:

这可以在 SQL Server 2005 及更高版本中使用公用表表达式 (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;

【讨论】:

  • 嗯...这与我的想法很接近。唯一的问题是我看不到嵌入式 UL 缩进列表中子项的方法。在上面添加了示例。我可能只是在代码中构建它,这样我就可以按照我的想法得到它。
  • 如果是这种情况,那么您将不得不对您的编码环境进行更多描述。您是否尝试在服务器或客户端上执行此操作?你在使用 jQuery 吗?您如何将数据传递给客户端?
  • 我决定只在代码中做一个递归循环。在数据库上可能更难,但更容易编码。不过感谢您的帮助!
  • 我写的代码的一个好处是它有一个层次结构。将整个数据集作为 JSON 对象传递给客户端,然后在客户端上构建您的列表非常容易。这将是尽可能快且对数据库/服务器的压力相对较小。使用 HierarchyLevel,很容易知道何时该添加一个子级或移动到下一个父级。
猜你喜欢
  • 1970-01-01
  • 2013-08-03
  • 2013-08-13
  • 2022-01-20
  • 2014-12-29
  • 2020-03-22
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
相关资源
最近更新 更多