如何停止 CTE 中的递归?

2024-05-09

我有一个数据库表,如下所示:

ID                                   | PredecessorID                        | Data
-------------------------------------|--------------------------------------|-----------------
43b1e103-d8c6-40f9-b031-e5d9ef18a739 | null                                 | ...
55f6951b-5ed3-46c8-9ad5-64e496cb521a | 43b1e103-d8c6-40f9-b031-e5d9ef18a739 | ...
3eaa0889-31a6-449d-a499-e4beb9e4cad1 | 55f6951b-5ed3-46c8-9ad5-64e496cb521a | ...

我知道我可以使用(递归)公用表表达式(CTE)来获取数据的排序列表:

WITH cte (ID, Data)
AS
(
  -- base case
  SELECT x.ID, x.Data
  FROM MyTable AS x
  WHERE x.PredecessorID IS NULL

  UNION ALL

  -- other cases
  SELECT x.ID, x.Data
  FROM MyTable as x
  INNER JOIN cte
    ON x.PredecessorID = cte.ID
)
SELECT * FROM cte

虽然这有效,但如果我想获取整个表,我想知道如何仅获取表的一部分,例如 ID 之间的所有内容x最多 IDy.

获得正确的下限很容易(我认为):只需更改WHERE我想要开始的 ID 的基本情况标准:

  -- base case
  SELECT x.ID, x.Data
  FROM MyTable AS x
  WHERE x.PredecessorID='...'

但上限又如何呢?一旦记录具有 ID,如何告诉 CTE 停止递归y已达到?


由于您正在此处进行迭代,并且在递归术语中获得了 cte 的最后一个 id,因此您可以过滤掉最后一次迭代命中“y”的结果

WITH cte (ID, Data)
AS
(
  -- base case
  SELECT x.ID, x.Data
  FROM MyTable AS x
  WHERE x.PredecessorID IS NULL

  UNION ALL

  -- other cases
  SELECT x.ID, x.Data
  FROM MyTable as x
  INNER JOIN cte
    ON x.PredecessorID = cte.ID
  WHERE cte.id <> 'y'
)
SELECT * FROM cte;

请注意,如果您的xid 有许多分支,其中一些分支不会导致“y”,那么这些分支将继续迭代,直到到达自然终点。唯一的分支通向y就会提前停在这里。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何停止 CTE 中的递归? 的相关文章

  • 如何找到多个列中的最小值

    我在我的 DB 3 col 中有一个值 我想在所有这些值中找到一个值 如下所述 表名 MyTable id col1 col2 col3 1 200 300 400 2 100 150 300 3 800 102 20 4 80 80 0
  • 我怎样才能知道oracle 9i中哪些值是数字

    我有这个包含 varchar 的数据库 我想知道哪些记录保存数值 我试过REGEXP COUNT和其他 但我在 9i 上运行 我认为这是针对 10g gt 我怎样才能实现这个目标 I tried select to number my co
  • 在单个 select 语句中多次有条件地求和同一列?

    我有一个表 显示每个月在给定位置的各种类型的部署的员工部署情况 ID Location ID Date NumEmployees DeploymentType ID 例如 一些记录可能是 1 L1 12 2010 7 1 Permanent
  • MySql 5.7 ORDER BY 子句不在 GROUP BY 子句中并且包含非聚合列

    我试图在不禁用 my ini 中的 only full group by 的情况下弄清楚 这是我的查询 SELECT p title COUNT t qty AS total FROM payments t LEFT JOIN produc
  • 如何在 DB2 AS/400 中将小数字段转换为日期字段?

    我有一个 DECIMAL 字段 其中包含 AS400 格式的日期 1100614 我努力了 cast MYDATE as DATE 但我无法将 DECIMAL 转换为 DATE 而 DATE MYDATE 返回空值 如何将此字段转换为日期字
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • sql查询获取从一月到当月的所有数据,即使没有记录

    我不擅长 sql 所以任何帮助世界都很棒 我有一个 SQL 查询 可以获取从一月到当月注册的记录 我的代码示例 SELECT DatePart YEAR p createStamp as TheYear DatePart MONTH p c
  • 在存储过程中验证用户的最简单方法?

    我需要一个存储过程 可以通过发送以下内容来检查登录尝试时他们是否是有效用户login and password查看它们在数据库中是否匹配 有没有一种简单的方法可以做到这一点 如果没有更多信息 我目前能提供的最好信息是 CREATE STOR
  • 递归例程获取PropertyInfo

    我正在尝试创建一个递归例程 它将检索指定对象 在 NET 3 5 中 下的所有成员的 PropertyInfos 直接成员的一切都正常 但它还需要解析嵌套类 及其嵌套类等 我不明白如何处理解析嵌套类的部分 这部分代码你会怎么写呢 publi
  • 内置函数将每个单词的第一个字母大写

    如果 SQL Server 中已存在此类函数 我不想为此创建自定义函数 输入字符串 This is my string to convert预期输出 This Is My String To Convert SET ANSI NULLS O
  • SQL Server 连接其他表中不存在的位置

    Service Asset AssetService Id Name Id Name AssetId ServiceId
  • 查找并打印 x1+x2+x3=num 的解数

    我需要写一个recusive接收整数的函数num并返回方程 的解数 x1 x2 x3 num where x1 x2 x3是 1 10 之间的数字 该方法应打印所有解决方案 例如如果num 3然后该方法将打印1 1 1并将返回1 if nu
  • 提高第一个查询的性能

    如果执行以下数据库 postgres 查询 则第二次调用要快得多 我猜第一个查询很慢 因为操作系统 linux 需要从磁盘获取数据 第二个查询受益于文件系统级别和 postgres 中的缓存 有没有一种方法可以优化数据库以快速获得结果fir
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • MYSQL从每个类别中随机选择一条记录

    我有一个数据库Items表看起来像这样 id name category int 有几十万条记录 每个item可以是 7 种不同的之一categories 对应于categories table id category 我想要一个从每个类别
  • SQL 约束以防止根据列的先前值更新列

    是否可以使用检查约束 或其他一些技术 来防止在更新记录时设置与其先前值相矛盾的值 一个例子是 NULL 时间戳 表明发生了某些事情 例如 file exported 一旦文件被导出并且具有非 NULL 值 就不应再将其设置为 NULL 另一
  • 如何使用 SQL Server 2008 将行复制到同一个表中

    A 到目前为止我的方式 sqlCommand CommandText INSERT Table1 column1 column2 column3 SELECT column1 column2 column3 FROM Table1 WHER
  • 更好地相当于这个疯狂的嵌套 python for 循环

    for a in map for b in map a for c in map b for d in map c for e in map d print a b c d e 上面的代码用于创建图中一定长度的所有路径 map a 表示从
  • 如何在 SQL Server 中连接

    我的数据库没有特定的列 因此我通过开关在查询中创建了一个列 我需要的是将此列与数据库中的另一列连接起来 select certificateDuration DurationType case when certificateDuratio

随机推荐

  • 如何将文件中的值分配给 UNIX sh shell 中的变量?

    我一直在搜索这个网站 试图找到这个问题的答案 并发现了几个非常好的答案 不幸的是 它们都不适合我 这是我正在使用的脚本 VALUE cat szpfxct tmp export VALUE echo gt gt LGFILE echo te
  • 如何在 python 中创建“空 if 语句”

    这在 C 语言中很常见 像这样破解 空 if 语句 if mostlyhappencondition empty statement else dosomething 它在 Python 中工作吗 我的意思是 我们可以通过使用它来提高应用程
  • 从 Eclipse 在 AWS-EMR 上运行 MapReduce 作业

    我在 Eclipse 中有 WordCount MapReduce 示例 我将其导出到 Jar 然后将其复制到 S3 然后我在 AWS EMR 上运行它 成功地 然后 我读到了这篇文章 http docs aws amazon com El
  • 定制导轨配置部分

    为 Rails 应用程序创建自定义配置部分的最佳方法是什么 理想情况下 我希望最终结果是一个 api 调用 例如 Rails configuration foo bar Rails configuration foo baz e g Rai
  • Parse.com 因超出突发限制而拒绝服务

    我使用 Parse 创建了一个 iOS 应用程序 其中使用的是从 Parse com 网站下载的 iOS SDK 为了创建此类应用程序 ApplicationID 和 ClientID 密钥都嵌入在 iOS 应用程序中 并在使用应用程序时从
  • 使用 AngularJS 将图像上传到 Firebase

    我有一个处理 剧集 的服务 创建 删除和更新它们 它看起来像这样 app service Episode firebase FIREBASE URL function firebase FIREBASE URL var ref new Fi
  • 使用动画更改 UIView 背景颜色

    我想改变我的UIView带有过渡动画的背景颜色 例如 如果视图是红色的 我将其更改为蓝色 蓝色将从屏幕底部向上滑动到顶部并充满整个屏幕 我想通过制作一个来做到这一点UIView具有相同大小和所需颜色 然后将其从屏幕外一直动画到顶部 但这似乎
  • 在 JavaScript 中嵌套“switch”案例:有速度优势吗?

    这里有新手问题 我有一个包含大量字符串的 开关 像这样按字母顺序拆分是否有速度优势 switch myString substring 0 1 case a switch myString case a string beginning w
  • 我应该如何在使用实例属性和类属性之间进行选择?

    我尝试了这个示例代码 class testclass classvar its classvariable LITERAL def init self x y self z x self classvar its initvariable
  • 如何在 Flutter 中为 Button 添加渐变?

    有没有办法改变ElevatedButton背景颜色渐变 如果没有一些小瑕疵或问题 例如缺少涟漪效应 不需要的边框 不尊重主题的内容 上述所有解决方案都无法真正发挥作用minWidth对于按钮 The 下面的解决方案没有上述问题 关键部分是使
  • 关于指针对齐的问题

    我正在研究内存池实现 我对指针对齐有点困惑 假设我有一个分配固定大小内存块的内存池 在创建内存池时我使用 malloc size num of block 如果分配的是对象 并且大小来自 sizeof 运算符对齐 则不必担心 但如果大小不均
  • 如何使用python检查任务管理器中某个进程是否正在运行

    我在 python 中有一个函数 当任务管理器中出现某个进程 例如 proc exe 时 该函数应该开始运行 如何使用 python 监控任务管理器中运行的进程 这是我改编的东西微软 http www microsoft com techn
  • 通过 cocoa pods 创建的 .xcworkspace 中的 .xcodeproj 文件被禁用

    我浏览互联网没有找到答案 所以这就是问题所在 我有一个项目 我在其中使用了 cocoa pods 因此通过 cocoa pods 为我创建的工作区文件打开它 但是在将我的操作系统 全新安装 更新到 MacOS Sierra 后 当我在 xc
  • Haskell Cabal 包 - 找不到 Paths_ 模块

    我正在开发一个 Haskell 项目 Happstack 服务器 Blaze HTML 前端作为主要库 我想添加一个静态数据目录 看起来你可以使用 Cabal 使用自动生成的Path
  • 在 django Rest 框架中实现角色

    我正在构建一个 API 应该拥有以下类型的用户 super user 创建 管理管理员 admin 管理事件 模型 和事件参与者 participants 参加活动 受管理员邀请参加活动 另外我想让每种类型的用户都有电话号码字段 I tri
  • 有没有办法设置一个变量一次并在多个地方使用它而不给它模块级别的范围?

    我有一个循环将用户窗体控件添加到集合中 由于多个地方都需要该集合 因此我将其放入模块中并在需要时调用它 这意味着该集合仅在需要时才位于内存中 但这也意味着我每次想要使用它时都会运行一个循环 I could已给出集合模块级别范围并在第一次需要
  • 类型“Promise”上不存在属性“finally”

    我试图对承诺使用finally 方法 但我不断收到此错误 Property finally does not exist on type Promise
  • 向 TextField 添加提示

    我想添加一个TextField带有集成的提示文本 用户提示 占位符 直到用户输入文本 当 TextField 获得焦点时 提示文本会消失 如果 TextField 失去焦点且未输入任何文本 则提示文本会重新出现 我最初认为这将是 Vaadi
  • Inno Setup:允许用户只选择可以安装软件的驱动器?

    我可以允许用户只选择要安装软件的驱动器吗 例如 他们可以选择C or D drive C Software D Software 但用户不能指定任何其他内容 就像他们不能选择安装下面的软件一样Downloads or MyDocumnets
  • 如何停止 CTE 中的递归?

    我有一个数据库表 如下所示 ID PredecessorID Data 43b1e103 d8c6 40f9 b031 e5d9ef18a739 null 55f6951b 5ed3 46c8 9ad5 64e496cb521a 43b1e