SQL Server 2008 CTE 递归

2023-12-25

我正在尝试使用 SQL Server 2008 的 CTE 来执行我认为是困难的递归。我似乎无法理解这个问题。

在下面的示例中,您可以假设固定深度为 3...不会低于该深度。在现实生活中,深度“更深”但仍然是固定的。在这个例子中我试图简化它一些。

我的输入数据如下所示。

ID     PARENT_ID       NAME          DEPTH
------------------------------------------
1      NULL            A             1
2      1               B             2
3      2               C             3
4      1               D             2

我的 CTE 的输出应该如下表。

LEVEL1_ID    LEVEL2_ID    LEVEL3_ID    LEVEL1_NAME    LEVEL2_NAME    LEVEL3_NAME
--------------------------------------------------------------------------------
1            NULL         NULL         A              NULL           NULL
1            2            NULL         A              B              NULL
1            2            3            A              B              C
1            4            NULL         A              D              NULL

如果我可以在输出中获取 ID 列,我当然可以映射到查找表中的名称。

我也愿意接受其他实现此目的的方法,包括使用 SSIS。


其实并不是那么难做到:

;WITH cte AS
(
    SELECT CAST('/' + Name AS VARCHAR(50)) as 'CteName', ID
    FROM dbo.YourTable
    WHERE parent_id IS NULL

    UNION ALL

    SELECT CAST(cte.CteName + '/' + Name AS VARCHAR(50)), t.ID
    FROM dbo.YourTable t
    INNER JOIN cte ON t.parent_id = cte.id
)
SELECT cteName FROM cte
ORDER BY ID

给我一个输出:

/A
/A/B
/A/B/C
/A/D

旁注:“深度”可以通过 CTE 轻松计算,您不一定需要将其存储在表中(请参阅Level我添加的专栏):

;WITH cte AS
(
    SELECT 
       CAST('/' + Name AS VARCHAR(50)) as 'CteName', ID, 
       1 AS 'Level'
    FROM dbo.YourTable
    WHERE parent_id IS NULL

    UNION ALL

    SELECT 
       CAST(cte.CteName + '/' + Name AS VARCHAR(50)), t.ID,
       cte.Level + 1 AS 'Level'
    FROM dbo.YourTable t
    INNER JOIN cte ON t.parent_id = cte.id
)
SELECT cteName FROM cte
ORDER BY Level, ID
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 2008 CTE 递归 的相关文章

随机推荐

  • 如何通过值找到json token然后删除token

    例如 我在 C 中有一个像这样的 json Harry firstName Harry Harry lastName Birimirski Harry recordTitle My title Harry SomeRepeatable GU
  • 在弹性搜索中使用脚本化字段时如何返回所有字段

    使用弹性搜索我试图添加一个计算的distance字段到地理搜索 我只想在搜索文档中附加一个额外的计算字段 但是当我通过 script fields 添加计算字段时 则仅返回该字段 我尝试添加通配符字段部分 但它并没有影响结果 如何让这个查询
  • 浏览器有时会显示 JSON 文本而不是所需的页面

    我的 Rails 应用程序遇到间歇性问题 并且无法弄清楚发生了什么 当用户登录时 他们会看到一个仪表板 其中包含一些 JavaScript 代码 这些代码对操作执行 AJAX 调用 有时 当用户登录时 他们不会看到仪表板 而是看到来自操作的
  • 如何从 Matlab 移植到 Headless Octave for Web

    我有一个自己编写的 Matlab 应用程序 希望将其放在运行 Octave 的 AWS 服务器上 以通过网络公开提供服务 我从来没有用过八度 我读过 no window system 将允许我无头运行 并且我知道我可以使用 saveas f
  • 在同一表单中使用多个提交按钮

    我无法访问框架中的所有按钮 它仅适用于直方图按钮 这是我的表单 我想在 Post 方法中访问它
  • 在我的代码中,为什么缺少函数声明对于一个函数来说不是问题,但对另一个函数却抛出警告?

    在下面的程序中 我使用了两个函数 prd 和 display 在 main 中调用它们之前 我没有在 main 之前声明它们 并且我在 main 之后定义了这两个函数 然而 while prd 在 main 中工作顺利 调用 display
  • Windows Phone 7 的独立存储位置?

    我正在使用 silverlight 4 构建 Windows Phone 7 应用程序 我将数据存储在隔离存储中 如上所述here http msdn microsoft com en us library ff626519 28v VS
  • Selenium-Chrome-Headless:无法从渲染器接收消息

    我在用 Chrome 最新稳定版本61 0 3163 79Chrome 驱动程序 2 31 硒3 4 0 詹金斯和码头工人 我第一次运行 Jenkins 时出现如下错误 1 732 INFO 等待待处理的导航已完成 状态 已断开连接 无法从
  • 使用 foreach 循环更新 std::list 中的每个值 C++

    我有一个std list在 C 中 我正在尝试使用for Type t list 更新每个对象的值的操作 所以我有一个名为球的列表 每个球都有一个位置 我的 for 循环代码是 for OpenGLView AssetInstance ba
  • 服务器使用 gmail smtp 发送电子邮件获取警报

    我做了类似的事情this https stackoverflow com questions 712392 send email using gmail smtp server from php page使我的网络应用程序通过 gmail
  • 尝试使用私有框架 IOSurface 进行屏幕捕获似乎不再适用于 iOS 9

    我正在为客户开发一个现有的 非应用程序商店 应用程序 该应用程序使用 IOSurface 私有框架在后台进行屏幕捕获 这里有一些关于 SO 的线程概述了该技术 以及几个开源示例项目 同样 这是客户端使用的内部应用程序 它不适用于应用程序商店
  • 如何清除我的漂浮物?

  • /bin/sh 的 .bashrc 是否有替代方案?

    我需要一个在启动时运行的脚本 bin sh 如同 bashrc for bin bash 有什么办法可以做到这一点吗 EDIT 我都尝试过 etc profile and profile 我写echo hello world 到两个文件 这
  • 重新创建 Win32 标头是个好主意吗?

    我发现自己最近针对 Win32 编写了更多的 C C 代码 并且来自 C 背景的我对完全一致的 干净代码 产生了痴迷 因此从漂亮的 System 命名空间回到了构成 Win32 API 头文件的 defines 的混杂有点文化冲击 在阅读了
  • std::mutex 锁在覆盖 new 运算符时挂起

    我们有一个与我们的产品之一一起使用的内部内存管理器 内存管理器覆盖new and delete运算符 并且在单线程应用程序中运行良好 然而 我现在的任务是让它也适用于多线程应用程序 据我了解 以下伪代码应该可以工作 但即使使用try loc
  • 在 MYSQL / PHP 中设置最大执行时间

    我有一个 XML 文档 其中包含大约 48 000 个子文档 50MB 我运行一个 INSERT MYSQL 查询 为每个子项创建新条目 问题是由于它的大小 需要花费很多时间 执行后我收到这个 Fatal error Maximum exe
  • 如何将十六进制字符串转换为双精度型?

    我从 BLE 获取 0x0000 到 0x01c2 范围内的十六进制值到我的手机 aString 为了将其绘制在图表中 我必须将其转换为double 我已经尝试过这个方法 https stackoverflow com a 10708508
  • 在 bash 中查找并删除 .txt 文件 [重复]

    这个问题在这里已经有答案了 最近 我的外部硬盘驱动器上存有我的照片 大多数都在 DVD 上 但是 因为某些分区被破坏了 幸运的是 我能够使用 PhotoRec 另一个 Unix 分区实用程序 和 PDisk 将所有内容重新组合在一起 Pho
  • 在 Dart 中监听 JS CustomEvent

    我知道我的问题并不新鲜 但我在这里和互联网上找到的所有解决方案都不起作用 或者 我正在做一些完全错误的事情 我需要在 Dart 和 JS 之间创建通信 并且我很想使用事件 因为这个想法看起来很简洁 所以 我尝试了这个教程 https dar
  • SQL Server 2008 CTE 递归

    我正在尝试使用 SQL Server 2008 的 CTE 来执行我认为是困难的递归 我似乎无法理解这个问题 在下面的示例中 您可以假设固定深度为 3 不会低于该深度 在现实生活中 深度 更深 但仍然是固定的 在这个例子中我试图简化它一些