SQL Server 树层次结构和具有重复记录 ID 的嵌套集

2023-12-04

鉴于我有这个结果集结构(多余的字段已被删除)

Id | ParentId | Name | Depth
----------------------------

是否可以按树顺序返回记录,即Parent then Children, if a Child is a Parent,那么他们的Children,如果不是那么Sibling, ETC?例如,

Id | ParentId | Name | Depth
----------------------------
1    NULL       Major    1
2    1          Minor    2
3    1          Minor    2
4    3          Build    3
5    3          Build    3
6    1          Minor    2

/* etc, etc */

我能想到的唯一方法是遵循这篇文章 -

使用嵌套集提高层次结构性能

并包括[LeftExtent] and [RightExtent]每条记录的字段。现在文章中的 SQL 工作正常Ids是唯一的,但在这个特定的树结构中,具有相同的记录Id可以出现在树中的不同位置(ParentId显然,领域是不同的)。我认为问题出在文章中的这个 SQL 中 -

  INSERT INTO @tmpStack
    (
      EmployeeID, 
      LeftExtent
    )
  SELECT TOP 1 EmployeeID, @counter 
  FROM Employee 
  WHERE ISNULL(ParentID, 0) = ISNULL(@parentid,0) 
  /* If the Id has already been added then record is not given [LeftExtent] or [RightExtent] values. */
  AND EmployeeID NOT IN (SELECT EmployeeID FROM @tmpStack) 

如何更改以允许重复记录Ids给出 [LeftExtent] 和 [RightExtent] 值,或者我完全缺少一种更简单的方法来按我需要的顺序返回结果集?


这是对我有用的一个:

@ParentID只是层次结构中的一个起点,但您可以传入0(但我认为您使用null作为基本ID,所以您会明白的)

有序排序的关键是使用构建的排序键。

WITH RoleHierarchy (RoleID, [Role], [Description], ParentID, Editable, HierarchyLevel, SortKey) AS
(
   -- Base
   SELECT
        RoleID,
        [Role],
        [Description],
        ParentID,
        Editable,
        0 as HierarchyLevel,
        CAST(RoleID AS VARBINARY(300))
   FROM
        dbo.Roles       
   WHERE
        RoleID = @ParentID

   UNION ALL

   -- Recursive
   SELECT
        e.RoleID,
        e.[Role],
        e.[Description],
        e.ParentID,
        e.Editable,
        th.HierarchyLevel + 1 AS HierarchyLevel,
        CAST (th.SortKey + CAST (e.[Role] AS VARBINARY(100)) + CAST (e.[RoleID] AS VARBINARY(100)) AS VARBINARY(300))
   FROM
        Roles e
        INNER JOIN RoleHierarchy th ON e.ParentID = th.RoleID
    WHERE
        e.RoleID != 0
)

SELECT
    RoleID,
    ParentID,
    [Role],
    [Description],
    Editable,
    HierarchyLevel
FROM
    RoleHierarchy
WHERE
    RoleID != @ParentID
ORDER BY
    SortKey
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 树层次结构和具有重复记录 ID 的嵌套集 的相关文章

随机推荐

  • 无状态 Spring MVC

    我目前正在阅读 Spring in Action 第三版 并且一直在尝试 Spring MVC 一切正常 直到我尝试将示例 Web 应用程序 移植 到无状态 Web 应用程序 为了确定是否创建了会话对象 我在 URL映射 只打印出req g
  • 使用 jQuery 加载图像并将其附加到 DOM

    我正在尝试从给定的链接加载图像 var imgPath imgLink attr href 并将其附加到页面上 这样我就可以将其插入到给定元素中对于图像查看器 尽管我搜索过堆栈溢出和jQuery文档没有尽头 我无法弄清楚 加载图像后 我想设
  • 保护C++程序免遭反编译[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以反编译C Builder exe C Builder exe 安全吗 我使用 Microsoft Visual C 2010 Express 来编写程序 当我想分发我的程序时 我使用 发布 配
  • 如何处理JPA命名查询中数字类型的空值

    我想将两个参数传递给namedquery 一种是数字类型 另一种是字符串类型 它们都可以为空 例如 id null username joe 和 id 1 username joe 是两个不同的结果 在namedQuery中 如果id为nu
  • 找不到静态文件 - 在 Heroku 上部署 Django

    我正在尝试在 Heroku 上部署 Django 站点 但在让应用程序查找我的静态文件时遇到问题 我用过python manage py collectstatic将我的静态文件收集到 staticfiles 文件夹中 但我的应用程序似乎仍
  • HttpWebRequest 不发送 UserAgent

    我对 net 的整个 Web 端很陌生 并且遇到了一个小问题 我正在尝试执行以下 HttpWebRequest 操作 String uri https skyid sky com signup HttpWebRequest request
  • 在 Pydantic v2 中使用 bson.ObjectId

    I found 一些例子关于如何在其中使用 ObjectIdBaseModel类 基本上 这可以通过创建 Pydantic 友好的类来实现 如下所示 class PyObjectId ObjectId classmethod def get
  • 什么是交错音频? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我在核心音频文档中多次看到此交错音频 有人可以向我解释此属性的真正功能是什么吗 一般来说 如果您有 2 个通道 我们将它们称为 L 左 和 R 右 并且您想要传输或存储 20 个样本
  • PHP 中的换行帮助

    上面是我正在使用的以下代码 我想要的输出是 title reportno 但我得到的输出是 title reportno 谁能告诉我我在换行中做错了什么 您需要添加一个 br 标记到您的输出 abc output
  • httpclient.execute(httpget) 之后的 Android 代码没有在 try 中运行(使用 AsyncTask)

    我正在尝试从网站获取数据并将其解析到我的 Android 应用程序中 不幸的是我什至没有到达解析数据的部分 该代码在以下行之后不会运行 HttpResponse response httpclient execute httpget 结果是
  • 使用 Transformer 模型进行多实例分类

    我使用这里的变压器Keras 文档示例用于多实例分类 每个实例的类取决于一个包中的其他实例 我使用变压器模型是因为 它不对数据之间的时间 空间关系做出任何假设 这非常适合处理一组对象 例如 每个包最多可以有 5 个实例 每个实例有 3 个特
  • C# 通过子字符串区分 List

    我想从字符串列表中删除重复项 我通过使用不同的来做到这一点 但我想在比较时忽略第一个字符 我已经有一个删除重复项的工作代码 但我的代码还删除了每个字符串的第一个字符 List
  • 根据值更改甘特图中的条形颜色

    我想根据我传递的值更改甘特图中条形的颜色 什么时候Percent done等于高于 100 条形图应为红色 是否可以 https jsfiddle net 1cez1duf google charts load current packag
  • GoogleApiClient 尚未连接异常

    我正在开发的应用程序有时可以正常工作 但有时却会出现此错误 致命异常 java lang RuntimeException 无法暂停活动 com example dell locationapi com example dell locat
  • QStackedWidget - 一页一页地更改页面

    有没有办法更改 QStackedWidget 的页面而不指定实际索引 self homeb clicked connect lambda self stackedWidget setCurrentIndex 0 因此 我不想直接使用按钮直接
  • 统计其他表中不存在的所有记录 - SQL 查询

    我有两 2 个表 我正在尝试计算 Table1 和 Table1 delta 中的所有记录 而 Table1 delta 中的页面名称尚未列出到 Table1 中 如果 Table1 delta 中的 pagename 被列出到 Table
  • Service Fabric 默认发布配置文件而不是 Local.xml

    我们公司正在使用 Service Fabric 开发新应用程序 我们遇到的一个常见问题是 多个开发人员使用远程服务器上的队列 数据库 存储 每个开发人员对此都有不同的配置 所有设置都存储在每个环境的 ApplicationParameter
  • Azure B2C - 在 Azure 中为不同用户类型设置多个登录的单一应用程序

    我正在构建一个 ASP Net core 应用程序 我有两种类型的用户 消费者和供应商 如何在 Azure AD B2C 中为两种不同类型的用户设置两种不同的注册 登录 因此 在我的 ASP 中 我可以有一个页面供消费者使用第三方提供商进行
  • 根据时间范围变量重复行 - R

    我的数据中有一个列变量 它是一个时间范围 datesemployed 样本数据如下 name datesemployed university Kate Oct 2015 Jan 2016 Princeton Sue Nov 2015 De
  • SQL Server 树层次结构和具有重复记录 ID 的嵌套集

    鉴于我有这个结果集结构 多余的字段已被删除 Id ParentId Name Depth 是否可以按树顺序返回记录 即Parent then Children if a Child is a Parent 那么他们的Children 如果不