当前位置: 首页 > 知识库问答 >
问题:

如何获取自引用表中每条记录的所有子项

公良文彬
2023-03-14

我的表格如下:

ID   | ChildsID | Name         
-----------------------              
1       NULL       Name1
2       1          Name2
3       2          Name3
4       3          Name4
5       4          Name5
6       5          Name6
7       6          Name7
8       7          Name8
9       8          Name9
10      9          Name10
11      3          Name11

现在,我需要一个查询,该查询可以为每个至少有一个子记录的记录获取所有可能的子记录,并返回如下数据集:

ID   | ParentID |   Name   |   ParentIDs         
-----------------------------------------              
1       NULL       Name1       11,10,9,8,7,6,5,4,3,2
2       1          Name2       11,10,9,8,7,6,5,4,3
3       2          Name3       11,10,9,8,7,6,5,4
4       3          Name4       10,9,8,7,6,5
5       4          Name5       10,9,8,7,6
6       5          Name6       10,9,8,7
7       6          Name7       10,9,8
8       7          Name8       10,9
9       8          Name9       10

共有2个答案

沃念
2023-03-14

您可以尝试使用此选项:

  SELECT a.*,x.ParentIDs
    FROM YourTable a
    CROSS APPLY (SELECT STUFF(CAST((SELECT ',' + CONVERT(VARCHAR,b.ID) 
    FROM YourTable b WHERE b.ID > a.ID AND ISNULL(b.ParentID,0) > ISNULL(a.ParentID,0) ORDER BY ID DESC
    FOR XML PATH(''), TYPE) AS VARCHAR(MAX)),1,1,'') AS ParentIDs ) x
    WHERE x.ParentIDs IS NOT NULL
澹台聪
2023-03-14

使用此查询。

更新结果:Fiddler演示

    CREATE TABLE TABLE1 (ID INT, ParentID INT, NAME VARCHAR(10));
INSERT INTO TABLE1 VALUES(1, NULL, 'Name1');
INSERT INTO TABLE1 VALUES(2, 1, 'Name2');
INSERT INTO TABLE1 VALUES(3, 2, 'Name3');
INSERT INTO TABLE1 VALUES(4, 3, 'Name4');
INSERT INTO TABLE1 VALUES(5, 4, 'Name5');
INSERT INTO TABLE1 VALUES(6, 5, 'Name6');
INSERT INTO TABLE1 VALUES(7, 6, 'Name7');
INSERT INTO TABLE1 VALUES(8, 7, 'Name8');
INSERT INTO TABLE1 VALUES(9, 8, 'Name9');
INSERT INTO TABLE1 VALUES(10, 9, 'Name10');
INSERT INTO TABLE1 VALUES(11, 3, 'Name11');

  SELECT ID, ParentID , Name, Child = STUFF((
          SELECT ',' + CAST(B.ID AS VARCHAR(100)) FROm TABLE1 AS B 
          WHERE ISNULL(A.ID, 0) < B.ID AND B.ID NOT IN(
              ISNULL((SELECT TOP 1 C.ID FROm TABLE1 AS C 
                      WHERE C.ParentID IN (
                            SELECT ParentID FROM TABLE1 WHERE ID <= A.ID) 
                      ORDER BY C.ID DESC), 0))  
          ORDER BY B.ID DESC 
          FOR XML PATH (''), type).value('.', 'varchar(max)'), 1,1,'')
 FROm TABLE1 AS A

旧结果:

 SELECT ID, ParentID , Name, ParentIDs = STUFF((
  SELECT ',' + CAST(B.ID AS VARCHAR(100)) FROm MyTable AS B 
  WHERE ISNULL(A.ID, 0) < B.ID ORDER BY B.ID  DESC FOR XML PATH (''), type).value('.',
          'varchar(max)'), 1,1,'')
 FROm MyTable AS A
 类似资料:
  • 问题内容: 嗨,我有一个引用自己的表,我需要能够从给定的父ID中选择父及其所有子记录。 我的表如下: 因此,对于上面的示例,我希望能够传递值1并获取上面的所有记录。 到目前为止,我已经提出了以下递归表值函数,但是它的行为不符合预期(仅返回第一条记录)。 问题答案: 你可以试试这个

  • 问题内容: 我有一个包含以下各列的模型: 我有索引和。 现在,我想获取由排序的每个对象的第一个日志。 一种方法是对每个用户名运行以下查询: 但这显然会查询数据库很多次(等于用户名的数量)。有什么方法可以只执行一个数据库查询吗? 问题答案: 另一种情况: 返回每个“第一”条目 的整行。 这种Ruby语法应该可以工作:

  • 问题内容: 在多表查询中,每条记录只能获得一行? 我有这三个表: 苹果 疲劳风险管理系统 FARM_APPLES 使用此表,我需要以下结果: 非常感谢您的任何帮助,在此先感谢您。 编辑 感谢OMG Ponies和Bill,我将尽力尝试您的两种解决方案,这是最后一件事,它有可能获得以下结果: 问题答案: Firebird 2.0支持CASE表达式,因此您可以使用:

  • 我正在寻找一种方法,以获得所有的DNS记录的网址<有没有一种方法可以在没有任何库的情况下使用C#实现这一点?

  • 本文向大家介绍MySQL获取所有分类的前N条记录,包括了MySQL获取所有分类的前N条记录的使用技巧和注意事项,需要的朋友参考一下 比如有文章表 Article(Id,Category,InsertDate),现在要用SQL找出每种类型中时间最新的前N个数据组成的集合,一段不错的代码,留存备用 @N 就是你要取多少条 下面是我用到了一个产品分类表中,superId是大分类,prcid是产品分类。能

  • 问题内容: 如标题所示,我想选择以分组的每组行的第一行和最后一行。 我在此表中包含以下数据: 我需要获取的是列开头的第一个值和列末尾的最后一个值,并按group by group列进行分组。 结果表应如下所示: 我使用和和进行了查询。它可以在SQL Server 2012中使用,但不能在SQL Server 2008中使用。我需要一个可以在SQL Server 2008中执行的查询。 问题答案: