递归CTE概念混淆

2023-11-29

我试图理解在 SQL 代码中使用 CTE 的概念。我已经浏览了许多解释这个概念的在线帖子,但我无法理解它如何迭代以呈现分层数据。解释 R-CTE 的广泛使用的示例之一是 Employee 和 ManagerID 示例,如下所示:

USE AdventureWorks
GO
WITH Emp_CTE AS (
  SELECT EmployeeID, ContactID, LoginID, ManagerID, Title, BirthDate
  FROM HumanResources.Employee
  WHERE ManagerID IS NULL

  UNION ALL

  SELECT e.EmployeeID, e.ContactID, e.LoginID, e.ManagerID, e.Title, e.BirthDate
  FROM HumanResources.Employee e
  INNER JOIN Emp_CTE ecte ON ecte.EmployeeID = e.ManagerID
)
SELECT *
FROM Emp_CTE
GO

锚点查询将抓住经理。之后,我无法理解如果递归查询一次又一次地调用锚查询并且锚查询只有一条记录(即经理),它将如何给其他员工带来影响。


所以你想了解递归 CTE。

这真的很简单。

首先是获取原始记录的种子查询。

  SELECT EmployeeID, ContactID, LoginID, ManagerID, Title, BirthDate
  FROM HumanResources.Employee
  WHERE ManagerID IS NULL

就您而言,这是没有经理的员工。
哪个是老板

用一个简化的例子来演示:

EmployeeID LoginID ManagerID Title 
---------- ------- --------- ------------
101        boss    NULL      The Boss

第二个查询查找先前具有经理记录的员工。

  SELECT e.EmployeeID, e.ContactID, e.LoginID, e.ManagerID, e.Title, e.BirthDate
  FROM HumanResources.Employee e
  INNER JOIN Emp_CTE ecte ON ecte.EmployeeID = e.ManagerID

由于它是递归 CTE,因此 CTE 在第二个查询中使用自身。
您可以将其视为一个循环,它使用前一个记录来获取下一个记录。

对于该递归循环的第一次迭代,您可能会得到如下结果:

 EmployeeID LoginID ManagerID Title 
---------- ------- --------- ------------
102        head1    101      Top Manager 1
103        head2    101      Top Manager 2

对于第二次迭代,它将使用第一次迭代中的记录来查找下一次迭代。

 EmployeeID LoginID ManagerID Title 
---------- ------- --------- ------------

104        bob     102       Department Manager 1
105        hilda   102       Department Manager 2

108        john    103       Department Manager 4
109        jane    103       Department Manager 5

对于第三次迭代,它将使用第二次迭代的记录。

...

这种情况一直持续到没有更多员工可以加入 ManagerID 为止

然后,在所有循环之后,CTE 将返回通过所有这些迭代找到的所有记录。

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

递归CTE概念混淆 的相关文章

  • 如何检查Azure SQL数据库中是否已存在数据库用户

    我的新客户计划使用 Azure 托管 SQL 数据库服务 我正在使用 dacpac 来部署数据库 在 dacpac 中 我有一个部署后脚本 用于创建 sql 用户 如下所示 IF NOT EXISTS SELECT name FROM sy
  • 如何使用索引更改表的列?

    我想将带有某些索引的表中 a 列的列大小从 varchar 200 更改为 varchar 8000 我应该如何进行 既然是VARCHAR你正在增加尺寸 然后简单地ALTER TABLE ALTER COLUMN https learn m
  • SQL 查询中的可选参数在检查 NULL 时非常慢

    我有许多已连接的表 最大行数约为 400 万条记录 我们正在存储过程中搜索该表 并且有一个默认值为 NULL 的可选参数 下面是我们正在运行的编辑示例 连接涉及更多表 但只有 1 个字段具有 WHERE 子句 DECLARE OwnerId
  • 插入MYSQL时自动初始化GETDATE()

    类似问题 https stackoverflow com questions 17700239 mysql column automaticly current time of insert w3schools 也许有用的链接 http w
  • SQL Server:删除具有外键约束的行:事务可以覆盖约束吗?

    我有一些添加了外键约束的表 它们与代码生成一起使用 以在生成的存储过程中设置特定的联接 是否可以通过在事务中调用多个删除来覆盖这些约束 特别是 C 中的 TransactionScope 或者绝对需要级联删除吗 不要使用级联删除 这样可能会
  • SQL 用随机数据填充表

    我有一个包含两个字段的表 id UUID 是主键并且 描述 var255 我想用SQL语句插入随机数据 我希望这个描述是随机的 PS 我正在使用 PostgreSQL 我不确定这是否符合 随机描述 的要求 也不清楚您是否想要生成完整的数据
  • 在 SQL Profiler 中查找特定 LINQ 查询的巧妙技巧

    由于有时会创建疯狂的 SQL 因此分析 LINQ 查询及其执行计划尤为重要 我经常发现我需要跟踪特定的查询 但很难在查询分析器中找到 我经常在有大量正在运行的事务的数据库 有时是生产服务器 上执行此操作 因此仅打开 Profiler 是没有
  • 有没有一种简单的方法来获取 .NET 为参数化查询生成的“sp_executesql”查询?

    背景 如果我有以下程序 public class Program public static void Main using var connection new SqlConnection Server local Database Te
  • 如何使用jdbc驱动编写事务?

    我想使用 jdbc 编写一个事务java 我尝试过这个简单的交易 BEGIN TRANSACTION NL GO NL UPDATE table SET col test where id 1010 NL GO NL COMMIT 我尝试过
  • 如何使用默认约束为mysql中的列创建随机数?

    DEFAULT 约束在接受字符串或当前日期值方面没有问题 我需要的是一个约束 每次创建实体时都会创建一个随机的 4 位数字 我尝试了以下代码 但它返回语法错误 ALTER TABLE client number ADD 代码 INT 4 D
  • 有没有适用于 Eclipse 的 SQL 格式化插件?

    我在网上没有找到任何标准的开源 sql 格式化程序 eclipse 插件 我正在使用日食太阳神 我可以找到编辑 gt 格式化SQL但这似乎不起作用 找到一个在http ventralnet blogspot in 2010 11 sql b
  • 如何在多行上使用 OPENJSON

    我有一个临时表 其中包含多行 每行都有一个名为Categories 其中包含一个非常简单的 json 数组ids对于不同表中的类别 临时表的一些示例行 Id Name Categories 539f7e28 143e 41bb 8814 a
  • SQL Server 2016-临时表-如何识别用户

    是否可以获得有关修改历史表中数据的用户 连接的信息 我读到了审计场景 其中我可以使用时态表 并且可以检测谁更改了数据 但我怎样才能做到这一点呢 一个看似无懈可击的审核解决方案 它给出了进行每个更改的登录用户的名称 并且对我的之前的回答 ht
  • sql“LIKE”查询语法

    这个查询有什么问题 string command get pay select Credit from Update Company Credit where Update Date LIKE System DateTime Today T
  • 为什么使用参数化查询将数据插入表比将值附加到查询字符串更快?

    为什么使用参数化查询向表中插入数据 string queryString insert into product id name values id name 比将值附加到查询字符串更快 string queryString insert
  • 处理多种权限类型的最佳方法是什么?

    我经常遇到以下场景 我需要提供许多不同类型的权限 我主要使用 ASP NET VB NET 和 SQL Server 2000 Scenario 我想提供一个可以处理不同参数的动态权限系统 假设我想授予某个部门或特定人员访问应用程序的权限
  • 子查询在多项选择时返回超过 1 个值的 SQL 错误

    我想要一个临时表 它将使用 select 语句插入值 但每次我运行查询时 总是出现错误 子查询返回超过 1 个值 当查询跟随 gt 或子查询用作表达式时 不允许这样做 该语句已终止 0 行受影响 这很奇怪 因为代码中似乎没有错误 但如果有的
  • 基于两个数据库表之间的数据比较创建oracle视图

    我有下表 我想创建视图以便descr O 以及对于常见的id isin两个表中的字段值 检查ratio字段并只取其中的行ratio字段值低 for descr O 如果 id isin 存在于一个表中但不存在于另一个表中 则获取这些行 双向
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • 如何返回调用不同数据库中的存储过程的远程数据库名称?

    我在一个 SQL Server 2008 R2 上有许多不同的数据库 为了便于论证 我们将它们称为 DB A DB B 和 DB C 我被要求开发一个将存在于 DB A 上的存储过程 该存储过程将用于删除和创建索引 并在 DB A 的表中存

随机推荐

  • 如何计算总执行时间并在响应标头中设置,即 Spring WebFlux 中每个请求的 x-runtime?

    不知道我的做法正确与否 另外 请告诉我是否有任何其他解决方法可以实现此目的 可以使用WebFilter吗 package request middlewares import org springframework stereotype C
  • 列出所有可能的组合[重复]

    这个问题在这里已经有答案了 我有一个关于组合的问题 我实际上正在开发一个电子商务网站 并且我有一个功能可以允许客户创建产品变体 例如 黑裤34W 30L 黑裤38W 32L 白裤34W 30L 这些被定义为产品变体 假设我的裤子有 3 个选
  • 使 IE 10 重复 svg 背景

    我有一个 svg 我将其用作身体的背景 我正在使用 x repeat 它可以在 chrome 和 FF 中工作 但在 ie10 实际上是 ie11 beta 中 背景被压扁 并且在每个 x repeat 之间有巨大的条形 链接在这里http
  • gm_auth 函数与 gargle_oauth_cache 停止工作

    我编写了从 gmail 下载电子邮件的 R 脚本 我已将 gm auth 与 gargle oauth cache 一起使用 library gmailr gm auth configure path path json gm auth e
  • python-selenium 有没有办法等待页面的所有元素加载完毕?

    我要求一般检查页面的所有元素是否已加载 有没有办法基本上检查一下 在具体的示例中 有一个页面 我单击某个按钮 然后我必须等到单击 下一步 按钮 然而 这个 下一步 按钮始终可用 可选择和单击 那么如何使用 selenium 检查页面的 状态
  • 单击产品标签时标签计数会自动更改

    我正在使用 Shopify 我在集合页面中 我获取所有带有标签计数的过滤器 例如 All Products Apple 4 Banana 2 Orange 1 Mango 8 现在 当我单击任何标签 例如我单击香蕉 时 它将显示香蕉产品 现
  • 无法将 io.ktor 导入到 Android Studio 中的 KMM 公共模块

    所以我是 Kotlin Multiplatform Mobile 和一般移动开发的新手 我正在尝试在这里遵循本教程关于 KMM 教程在我的项目中使用 Ktor 添加依赖后 如build gradle kts所示 下面 commonMain
  • 国际化不起作用或者我不知道如何使其起作用

    Settings py常量 TIME ZONE Europe Vilnius LANGUAGE CODE lt USE I18N True USE L10N True USE TZ True MIDDLEWARE CLASSES djang
  • 使用 C# 的 Magento SOAP API V2:需要 HTTP 身份验证的商店出现问题

    修改后的问题我修改了原来的问题 如下所示 以便我可以将问题的一部分标记为已回答 所以这里是 我构建了一个工具来从客户商店 magento 导入销售订单 以便集成到我们的旧订单处理系统中 我有五家商店可供进口 其中之一在其商店中设置了 HTT
  • 计算 git 存储库中的行数

    如何计算 git 存储库中所有文件中存在的总行数 git ls files给我一个 git 跟踪的文件列表 我正在寻找一个命令cat所有这些文件 就像是 git ls files cat all these files wc l xargs
  • 元素嵌套时覆盖 em 字体大小

    当您有嵌套元素时 如何覆盖 font size 属性 使用 重要的似乎没有任何效果 div font size 6em p font size 1em important span font size 1em div span span s
  • 分页循环Google脚本

    我完全是个新手 想出了以下 Google 脚本来发送 GET 请求 然后将响应解析到 Google Sheet 中 我只能在第一页上请求 50 个项目 并且我尝试寻找一种循环页面的方法 直到获得我请求的所有数据 我确信如果有人能指出我正确的
  • 为什么我在 ggtext 的轴标签中使用 png 徽标的代码不起作用

    我正在尝试学习 改进 R 中的可视化 这个精彩的帖子 对于第一部分 它似乎效果很好 但是轴文本被徽标替换的部分不起作用 显示的错误是 Error in png readPNG get file path native TRUE file i
  • 如何将带参数的 WordPress 短代码传递给模板

    我有带有子主题的模板 我编辑子模板 function php 目标是创建简短的代码 其中包含参数和模板文件的一部分 我的函数如下所示 function my shortcode atts array extract shortcode at
  • jQuery 类选择器不起作用,id 选择器仅适用于“body”

    我正在尝试使用 jquery 应用 CSS 值 但类选择器或 id 选择器由于某种原因不起作用 这是我的小提琴 如您所见 如果我使用 id kitten 则不会发生任何情况 HTML div div Script function var
  • 签名的小程序可以与它们所源自的不同主机连接吗?

    我需要一个小程序来打开套接字并与侦听的服务器进行通信 小程序下载到的本地主机 最终用户计算机 与我读到的有关小程序安全性的内容相反 似乎甚至签名的小程序 无法打开到下载它们的不同主机的套接字 在同一台机器上它工作得很好 我已经使用 self
  • angularjs 路由可以有可选的参数值吗?

    我可以设置带有可选参数的路线 相同的模板和控制器 但如果某些参数不存在 则应忽略它们 因此 与其编写以下两条规则 而只编写一条 module config routeProvider function routeProvider route
  • 在 SQL Server 视图中使用表值函数

    如果我尝试以下查询 我有一个表值函数可以正常工作 SELECT FROM dbo GetScheduleForEmployee AS schedule 但是 如果我尝试使用该查询创建视图 则会收到 参数太少 错误 表值函数和视图有限制吗 这
  • 如何通过使用delphi 7中的API获取Netstat信息

    我的任务是查找 abt n w 信息 或者 Windows 中 netstat 命令给出的信息 现在 我被告知使用一些 API 来提取该信息 任何可用于 delphi 7 执行此任务的 API 都会有所帮助 我遇到过这个 API 即 IP
  • 递归CTE概念混淆

    我试图理解在 SQL 代码中使用 CTE 的概念 我已经浏览了许多解释这个概念的在线帖子 但我无法理解它如何迭代以呈现分层数据 解释 R CTE 的广泛使用的示例之一是 Employee 和 ManagerID 示例 如下所示 USE Ad