栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

查询以获取带有子记录的父记录,然后是mysql中的下一个父子记录

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

查询以获取带有子记录的父记录,然后是mysql中的下一个父子记录

我在这里提出的解决方案使用了物化路径的概念。以下是使用样本数据的实例化路径的示例。我希望它可以帮助您理解物化路径的概念:

+----+--------------------------+----------+------------------+| ID |Name| ParentID | MaterializedPath |+----+--------------------------+----------+------------------+|  1 | Parent 1      |        0 | 1     ||  2 | Parent 2      |        0 | 2     ||  4 | Parent 2 Child 1         |        2 | 2.4   ||  6 | Parent 2 Child 1 Child 1 |        4 | 2.4.6 ||  7 | Parent 2 Child 1 Child 2 |        4 | 2.4.7 ||  3 | Parent 1 Child 1         |        1 | 1.3   ||  5 | Parent 1 Child 1 Child   |        3 | 1.3.5 |+----+--------------------------+----------+------------------+

每个节点

N
都有一个实例化路径,该路径告诉您从​​根节点到该节点的路径
N
。可以构建连接节点ID的连接。例如,
5
要从其根节点开始到达节点,请访问node
1
,node
3
和node
5
,因此node的
5
物化路径为
1.3.5

巧合的是,您要查找的订单可以通过实现路径来实现。

在前面的示例中,实例化路径是buit连接字符串,但是出于多种原因,我更喜欢二进制连接。

要构建物化路径,您需要以下递归CTE:

CREATE TABLE Tree(    ID int NOT NULL ConSTRAINT PK_Tree PRIMARY KEY,     Name nvarchar(250) NOT NULL,    ParentID int NOT NULL,)INSERT INTO Tree(ID, Name, ParentID) VALUES(1, 'Parent 1', 0),(2, 'Parent 2', 0),(3, 'Parent 1 Child 1', 1),(4, 'Parent 2 Child 1', 2),(5, 'Parent 1 Child 1 Child', 3),(6, 'Parent 2 Child 1 Child 1', 4),(7, 'Parent 2 Child 1 Child 2', 4)GOWITH T AS(    SELECt        N.ID, N.Name, N.ParentID, CAST(N.ID AS varbinary(512)) AS MaterializedPath    FROM        Tree N    WHERe        N.ParentID = 0    UNIOn ALL    SELECt        N.ID, N.Name, N.ParentID, CAST( T.MaterializedPath + CAST(N.ID AS binary(4)) AS varbinary(512) ) AS MaterializedPath    FROM        Tree N INNER JOIN T ON N.ParentID = T.ID)SELECt *FROM TORDER BY T.MaterializedPath

结果:

+----+--------------------------+----------+----------------------------+| ID |Name| ParentID |      MaterializedPath      |+----+--------------------------+----------+----------------------------+|  1 | Parent 1      |        0 | 0x00000001      ||  3 | Parent 1 Child 1         |        1 | 0x0000000100000003         ||  5 | Parent 1 Child 1 Child   |        3 | 0x000000010000000300000005 ||  2 | Parent 2      |        0 | 0x00000002      ||  4 | Parent 2 Child 1         |        2 | 0x0000000200000004         ||  6 | Parent 2 Child 1 Child 1 |        4 | 0x000000020000000400000006 ||  7 | Parent 2 Child 1 Child 2 |        4 | 0x000000020000000400000007 |+----+--------------------------+----------+----------------------------+

上面的递归CTE从根节点开始。计算根节点的物化路径非常简单,它是节点本身的ID。在下一次迭代中,CTE将根节点与其子节点连接在一起。子节点

CN
的实例化路径是其父节点的实例化路径与节点
PN
ID的串联
CN
。随后的迭代在树上向下移动一级,直到到达叶节点为止。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/670293.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号