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

选择所有层次结构级别以及下面的SQL Server

秦鸿羽
2023-03-14
问题内容

我在这方面遇到了困难。我已经看到了一些示例,这些示例说明了如何从给定父级的自引用表中获取所有子级记录,甚至如何获取子级记录的父级。

我想做的是返回一条记录,并给所有子记录指定ID。

为了说明这一点-我有一个公司层次结构。在哪里:

#Role        Level#
--------------------
Corporate         0
Region            1
District          2
Rep               3

我需要的是一个过程(1)弄清记录的级别,以及(2)检索该记录和所有子记录。

作为区域的想法可以看到一个区域中的所有地区和代表,而地区可以看到他们的代表。代表只能看到自己。

我有桌子:

ID            ParentId           Name
-------------------------------------------------------
1             Null               Corporate HQ
2             1                  South Region
3             1                  North Region
4             1                  East Region
5             1                  West Region
6             3                  Chicago District
7             3                  Milwaukee District
8             3                  Minneapolis District
9             6                  Gold Coast Dealer
10            6                  Blue Island Dealer

我该怎么做呢:

CREATE PROCEDURE GetPositions
    @id int
AS
BEGIN
    --What is the most efficient way to do this--
END
GO

例如,@ id = 3的预期结果,我想返回

3, 6, 7, 8, 9, 10

我将不胜感激,对此有任何帮助或想法。


问题答案:

您可以通过递归CTE来做到这一点:

DECLARE @id INT = 3;

WITH rCTE AS(
    SELECT *, 0 AS Level FROM tbl WHERE Id = @id
    UNION ALL
    SELECT t.*, r.Level + 1 AS Level
    FROM tbl t
    INNER JOIN rCTE r
        ON t.ParentId = r.ID
)
SELECT * FROM rCTE OPTION(MAXRECURSION 0);

[**ONLINE DEMO**](https://data.stackexchange.com/stackoverflow/query/476511)



 类似资料:
  • 问题内容: 我有一个包含一个类别的FK的产品表,创建类别表的方式是每个类别都可以有一个父类别,例如: 我需要进行选择查询,如果选择的类别是“处理器”,它将返回英特尔,奔腾,Core 2 Duo,AMD等产品。 我考虑过要创建某种“缓存”,该缓存将为数据库中的每个类别存储层次结构中的所有类别,并在where子句中包含“ IN”。这是最好的解决方案吗? 问题答案: 最好的解决方案是在数据库设计阶段。您

  • 我有一个绑定到MVVM可观察集合的TreeView。我的项目模板由图像和文本块组成,如以下代码所示: 当然,发生这种情况是因为堆栈面板现在位于选择区域上方。 有什么解决办法吗?

  • 问题内容: 我有课: 然后创建对象: 尝试获取所有字段后,我打电话 但是我只有一个数组 如何从所有类的所有字段包括扩展? 问题答案: 请尝试以下操作:

  • 问题内容: 我试图从我的MySQL数据库中按层次结构获取所有类别和子类别: 我的结果应该是这样(只是示例): 猫A 子猫1 Sub_Sub_Cat 1 Sub_Sub_Cat 2 子猫2 猫B C猫 … MySQL代码: 简而言之,如何在使用 PHP代码 的层次结构中获得它? 问题答案: 使用邻接表模型时,您可以一次性生成结构。 取自一遍父子数组结构(2007年9月; Nate Weiner撰写)

  • 我正在尝试建立自己的Webshop。 我有两个表-products和categories。结构是这样的: 当用户点击main category时,我选择要显示的产品如下所示: 问题是,我希望当用户单击主类别时,也可以选择其子类别中的所有产品。例如,类别是类别的子类别,在db中类似于 如您所见,我的当前选择将不会选择或,因为用户正在查看具有的类别...如何修改我的选择,使它将显示所有产品从主类别的子

  • 除了基本的选择器外,jQuery的层级选择器更加灵活,也更强大。 因为DOM的结构就是层级结构,所以我们经常要根据层级关系进行选择。 层级选择器(Descendant Selector) 如果两个DOM元素具有层级关系,就可以用$('ancestor descendant')来选择,层级之间用空格隔开。例如: <!-- HTML结构 --> <div class="testing"> <u