当前位置: 首页 > 面试题库 >

从自引用表中获取层次结构数据

令狐珂
2023-03-14
问题内容

假设您有下表:

items(item_id, item_parent)

…这是一个自引用表-item_parentitem_id

您将使用什么SQL查询来选择表中的所有项目以及它们的深度,其中项目的深度是该项目的所有父项和祖父母的总和。

该表的内容是否如下:

item_id     item_parent
----------- -----------
1           0          
2           0            
3           2          
4           2          
5           3

…查询应检索以下对象集:

{“ item_id”:1,“ depth”:0}
{“ item_id”:2,“ depth”:0}
{“ item_id”:3,“ depth”:1}
{“ item_id”:4,“ depth”: 1}


PS我正在寻找一种MySQL支持的方法。


问题答案:

如果数据库是SQL 2005/2008,则…

最简单的方法是使用旨在递归的CTE(公用表表达式)。

 WITH myCTE (Item_id, Depth)
 AS
 (
    Select Item_ID, 0 as Depth From yourTable where Item_Parent=0
    Union ALL
    Select yourTable.Item_ID, Depth + 1 
    From yourTable 
    inner join myCte on yourTable.item_Parent = myCte.Item_Id
 )

 Select Item_id, Depth from myCTE

输出如下:

Item_Id  Depth
    1   0
    2   0
    3   1
    4   1
    5   2

由此,您可以根据需要设置其格式。



 类似资料:
  • 如果我有这样一门课: 获取节点的所有父层次结构的最简单/最优雅的方法是什么? 类似于:

  • 问题内容: 我有一个带有分层数据的表,其结构如下所示: 如果我传递节点ID,则希望通过在SQL中遍历其所有父节点来获得最高的节点ID /细节。 我尝试过CTE,但我无法以某种方式获得正确的组合。但是,我将此功能用作函数,但是它太慢了,以至于我不得不发布这个问题。 在上面的示例中,如果我通过6,则我想拥有最高的即1。通过遍历6 => 5 => 3 => 2 => [1](结果) 在此先感谢您的帮助。

  • 问题内容: 我正在尝试查找指定目录下的所有文件和文件夹 例如我有/ home / user / stuff 我想回来 希望这是有道理的! 问题答案:

  • 问题内容: 我有一个包含分层数据的表。 列“ ParentId”保存其父级的ID(“ ID”-关键列)。 删除一行时,我要删除所有子级(所有级别的嵌套)。 怎么做? 谢谢 问题答案: 当行数不太大时,erikkallen的递归方法起作用。 这是使用临时表收集所有子项的替代方法: 它从带有@delete_id的行开始,然后从那里开始。where语句用于防止递归;如果您确定没有任何内容,则可以将其忽略

  • 问题内容: 我将MySql与PHP结合使用,并将所有数据存储在这样的表中: 由此,如果我有例如:id = 10,sql将如何显示项目的层次结构? 因此,对于id = 10,层次结构为: 对于id = 7,层次结构为: 对于id = 4,层次结构为 等等。任何想法如何构造SQL来实现这一目标? 问题答案: 试试这个存储过程 查询1 : SQL FIDDLE : 希望这可以帮助

  • 到目前为止,我们一直在使用Spring JpaRepository来满足我们的需求。我觉得这个新需求需要自定义查询,我不认为可以直接使用JParepository来处理这个问题。我只想知道你是怎么想的。不需要自定义sql查询就可以做到这一点吗?