具有三个表的递归 CTE

2024-03-03

我正在使用 SQL Server 2008 R2 SP1。 我想通过“沿着树向上走”来递归地找到某个组织单位的第一个非空经理。

我有一张包含组织单位“ORG”的表,一张包含每个组织的父级的表。 “ORG”中的单位,我们将该表称为“ORG_PARENTS”,并且包含每个组织单位的经理的一个表,我们将该表称为“ORG_MANAGERS”。

ORG 有一个列 ORG_ID:

ORG_ID

1

2

3

ORG_PARENTS 有两列。

ORG_ID, ORG_PARENT

1, NULL

2, 1

3, 2

MANAGERS 有两列。

ORG_ID, MANAGER

1, John Doe

2, Jane Doe

3, NULL

我正在尝试创建一个递归查询,它将找到某个组织单位的第一个非空经理。

基本上,如果我今天对经理进行 ORG_ID=3 查询,我将得到 NULL。

SELECT MANAGER FROM ORG_MANAGERS WHERE ORG_ID = '3'

我希望查询使用 ORG_PARENTS 表来获取 ORG_ID=3 的父表,在本例中获取“2”,并针对 ORG_ID=2 的 ORG_MANAGERS 表重复查询,并在此示例中返回“Jane Doe”。

如果查询也返回 NULL,我想对 ORG_ID=2 的父级重复该过程,即 ORG_ID=1 等等。

到目前为止,我的 CTE 尝试都失败了,一个例子是这样的:

WITH BOSS (MANAGER, ORG_ID, ORG_PARENT)
AS
( SELECT m.MANAGER, m.ORG_ID, p.ORG_PARENT
FROM dbo.MANAGERS m INNER JOIN
dbo.ORG_PARENTS p ON p.ORG_ID = m.ORG_ID
UNION ALL
SELECT m1.MANAGER, m1.ORG_ID, b.ORG_PARENT
FROM BOSS b
INNER JOIN dbo.MANAGERS m1 ON m1.ORG_ID = b.ORG_PARENT
)

SELECT * FROM BOSS WHERE ORG_ID = 3

它返回:

消息 530,第 16 级,状态 1,第 4 行 声明终止。在语句完成之前,最大递归次数 100 已用完。

MANAGER ORG_ID  ORG_PARENT
NULL      3        2

您需要跟踪您开始使用的原始 ID。尝试这个:

DECLARE @ORG_PARENTS TABLE (ORG_ID INT, ORG_PARENT INT ) 
DECLARE @MANAGERS TABLE (ORG_ID INT, MANAGER VARCHAR(100))

INSERT @ORG_PARENTS (ORG_ID, ORG_PARENT)
VALUES  (1, NULL)
,       (2, 1)
,       (3, 2)

INSERT @MANAGERS (ORG_ID, MANAGER)
VALUES (1, 'John Doe')
,       (2, 'Jane Doe')
,       (3, NULL)
;
WITH BOSS
AS
( 
    SELECT      m.MANAGER, m.ORG_ID AS ORI, m.ORG_ID, p.ORG_PARENT, 1 cnt
    FROM        @MANAGERS m 
    INNER JOIN  @ORG_PARENTS p 
                ON p.ORG_ID = m.ORG_ID
    UNION ALL

    SELECT      m1.MANAGER, b.ORI, m1.ORG_ID, OP.ORG_PARENT, cnt +1
    FROM        BOSS b
    INNER JOIN  @ORG_PARENTS AS OP
            ON  OP.ORG_ID = b.ORG_PARENT
    INNER JOIN  @MANAGERS m1 
            ON  m1.ORG_ID = OP.ORG_ID 
)

SELECT  * 
FROM    BOSS 
WHERE   ORI = 3

结果是:

+----------+-----+--------+------------+-----+
| MANAGER  | ORI | ORG_ID | ORG_PARENT | cnt |
+----------+-----+--------+------------+-----+
| NULL     |   3 |      3 | 2          |   1 |
| Jane Doe |   3 |      2 | 1          |   2 |
| John Doe |   3 |      1 | NULL       |   3 |
+----------+-----+--------+------------+-----+

一般提示:

不要预定义 CTE 的列;这是没有必要的,并且使维护变得烦人。

使用递归 CTE,始终保留一个计数器,这样您就可以限制递归性,并且可以跟踪您的深度。

edit:

顺便说一句,如果你想要第一个非空管理器,你可以这样做(有很多方法):

SELECT  BOSS.* 
FROM    BOSS 
INNER JOIN (
                SELECT  BOSS.ORI
                ,       MIN(BOSS.cnt) cnt
                FROM    BOSS
                WHERE   BOSS.MANAGER IS NOT NULL
                GROUP BY BOSS.ORI 
            ) X
        ON  X.ORI = BOSS.ORI
        AND X.cnt = BOSS.cnt
WHERE   BOSS.ORI IN (3)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有三个表的递归 CTE 的相关文章

  • 如何对 Stack Exchange Data Explorer (SEDE) 结果进行分页?

    Using 数据浏览器 https data stackexchange com stackoverflow query 875322创建查询 SELECT P id creationdate tags owneruserid answer
  • 将 copyfromrecordset 写入范围

    我有以下 vba 它从单元格 C10 开始读取 MCO 直到其为空 并将从 SQL 数据库获取机器数量 解密和升级机器数量 这工作正常 但我在获取相应行中的数据时遇到问题 目前它总是将数据写入 D10 因为我已经对其进行了硬编码 但我不确定
  • 如何在Oracle数据库11g中创建新模式/新用户?

    我已经申请了一家公司的实习机会 作为一个问题 他们要求我为他们的公司创建一个具有一定要求的架构 并将DDL文件 我已经安装了 Oracle 数据库 11g Express 版本 但如何在 Oracle 数据库 11g 中创建新架构 我在网上
  • PDO dblib 未捕获警告

    我已经使用 realestateconz mssql bundle 和免费 TDS 成功使我的 symfony 应用程序连接到 MSSQL 数据库 我的问题是 当我尝试执行存储过程时 如果出现问题 该过程会引发异常 但 PDO 不会报告任何
  • 如何在sql中提取周数

    我有一个 varchar2 类型的转换列 其中包含以下主菜 01 02 2012 01 03 2012 etc 我使用 to date 函数将其转换为另一列中的日期格式 这是我得到的格式 01 JAN 2012 03 APR 2012 当我
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • Powershell SQL Server数据库连接和连接超时问题

    我有一个连接到 SQL Server 2012 数据库的 powershell 脚本 该脚本运行 SQL 查询并将结果集放入数据表中 以将格式化的电子邮件发送给相关方 下面是问题所在的代码片段 CBA New Object System D
  • 在单个查询中设置和选择?

    我想知道是否可以在单个查询中设置和选择 像这样的事情 SET LOCAL search path TO 1 SET LOCAL ROLE user SELECT from posts 你可以这样做 with some set as sele
  • 将存储过程的结果加上额外的列插入表中

    如何在其中插入更多列dbFileListOnly表以及 EXEC 查询 INSERT INTO admindb dbfilelistonly path col1 col2 path EXEC RESTORE FILELISTONLY FRO
  • SSIS使用列位置而不是名称导入Excel文档

    我想知道是否可以通过按位置引用列来使用 SSIS 导入 Excel 文档 例如 导入列 A D M AA 等 我问这个问题是因为我需要从第三方加载多个 Excel 文档 每个文档在相应的列中包含相同的数据类型 但每个文档的列名称不同 Tha
  • SQL Server 表中最多可以有多少行

    通常我们可以给出更多的值 在SQL Server中一个表最多可以有多少行 之后我们就无法添加新行了 有一些边缘情况 除了明显的磁盘空间问题之外 SQL Server 会阻止您添加更多行 而不是确切的行数 但值得一提 你有一个IDENTITY
  • 如何使用 RODBC 将数据帧保存到数据库生成的主键表

    我想使用 R 脚本将数据框输入到数据库中的现有表中 并且希望数据库中的表具有顺序主键 我的问题是 RODBC 似乎不允许主键约束 这是创建我想要的表的 SQL CREATE TABLE dbo results ID INT IDENTITY
  • Sybase 中神秘的“时间戳”数据类型是什么?

    我最近在工作中发现 Sybase 数据库中的一个表使用 时间戳 类型的列 如果我使用这种神秘的时间戳数据类型创建一个表 如下所示 create table dropme foo timestamp roo int null insert i
  • 插入并发问题-多线程环境

    我有一个问题 即使用完全相同的参数在完全相同的时间调用相同的存储过程 存储过程的目的是获取记录 如果存在 或创建并获取记录 如果不存在 问题是两个线程都在检查记录是否存在并报告错误 然后都插入新记录 在数据库中创建重复记录 我尝试将操作保留
  • 如何在jOOQ中使用别名

    有人可以指导我如何在 jOOQ 中使用别名吗 我尝试查看 jOOQ 文档 但不清楚 如果可能 请提供示例 Both org jooq Table http www jooq org javadoc latest org jooq Table
  • 如何在 Doctrine 中使用 andWhere 和 orWhere ?

    WHERE a 1 AND b 1 Or b 2 AND c 1 OR c 2 我怎样才能在教义中做到这一点 q gt where a 1 q gt andWhere b 1 q gt orWhere b 2 q gt andWhere c
  • MySQL - 替换列中的字符

    作为一个自学成才的新手 我给自己制造了一个大问题 在将数据插入数据库之前 我将字符串中的撇号 转换为双引号 而不是 MySQL 实际需要的反斜杠和撇号 在我的表增长到超过 200 000 行之前 我认为最好立即纠正此问题 所以我做了一些研究
  • 在 BEFORE INSERT 触发器中使用 IF EXISTS (SELECT ...) (Oracle)

    我的代码不起作用 Oracle 告诉我创建触发器时出现构建错误 显然我无法获得有关构建错误的更准确信息 我以前确实没有做过很多SQL 所以我对语法不太熟悉 我有一种预感 Oracle 不喜欢我的 IF EXISTS SELECT THEN
  • ORDER BY id 或 date_created 显示最新结果?

    我有一个表 实际上有几个 我想首先从中获取最新条目的结果 这是我的ORDER BY条款选项 date created INT 从不改变值 id 当然是INT AUTO INCRMENT 两列应同等地代表记录插入的顺序 我自然会使用date
  • 优化mysql中日期类型字段的查询

    我目前准备了以下查询 select sum amount as total from incomes where YEAR date 2019 and MONTH date 07 and incomes deleted at is null

随机推荐

  • C# Linq 中的多级包含

    我想在我的 linq 语句中包含 MULTILEVEL 例如 var a departments include u gt u Customers include u gt u Customers Include u gt u Orders
  • 使用列表的递归 - Haskell

    我正在尝试编写一个递归函数 该函数将包含整数列表的列表作为输入并返回类型为 Int Int 的元组 Int Int 这是一个 棋盘游戏 您将获得一个棋盘 5 4 3 8 6 0 2 1 0 7 0 1 9 4 3 2 3 4 0 9 这将是
  • Excel 两个时间之间的 IF AND 公式

    我想要一个公式 它可以告诉我单元格中的时间是否在其他单元格中的两个单独值之间 如果是 则返回一个值 我已经创建了下面的代码 但这根本不返回任何值 IF AND F4 gt R 1 F4
  • 在 PostgreSQL 中创建约束时,有没有办法处理 JSON 数组的所有元素?

    PostgreSQL 是否提供任何符号 方法来施加约束eachJSON 数组的元素 一个例子 create table orders data json insert into orders values order id 45 produ
  • Python:repr 与反引号

    在Python中 有什么区别repr和反引号 1 左边 用于演示 class A object def repr self return repr A def str self return str A gt gt gt a A gt gt
  • 如何在 AspNet5 / Mvc6 中检测 dnx451 Web 应用程序关闭?

    为了能够关闭后台进程 使用 Quartz Net 实现 我需要检测 AspNet5 beta8 中的 Web 应用程序关闭 在以前版本的 Asp Net 中 可以在 Application End 上执行代码 AspNet5 中的 Appl
  • 如何从BitmapImage获取BitmapSource?

    如何从BitmapImage获取BitmapSource 或者如何直接将BitmapImage转换为BitmapFrame 在我看来 如果我有 BitmapSource 我可以使用 BitmapFrame Create 并最终从给定的 Bi
  • Netbeans GUI 预览与运行时视图不同

    我正在使用 NetBeans 及其 GUI 编辑器开发一个简单的 Java 应用程序 我坚持创建一个简单的对话框 运行时它看起来与我设计的以及编辑器中预览的不同 基本上 单击按钮就会出现我的对话框 private void jButton1
  • 模拟 GCC 语句表达式

    我被迫使用 IAR EW430 编译器 v7 12 进行嵌入式项目 并且它仅正式支持 c99 我希望能够通过除了编写一堆专用内联函数之外的任何方式以通用方式模拟 GCC 的语句表达式 有什么办法可以实现这一点吗 也许使用 MACRO wiz
  • 在 Jupyter Notebook 中的任意位置重命名变量

    有没有办法重命名当前 jupyter 笔记本文件中各处的变量 IE 假设我的笔记本通过我的脚本在多个函数和位置引用变量 foo 后来我决定将此变量重命名为 bar 以获得更好的可读性 在 Xcode 中 您可以突出显示并右键单击来执行此操作
  • 如何使用 Webdriver 和 C# 通过 Selenium 定位并单击嵌套在多个框架和框架集中的元素

    我有如下所示的 html 页面 我需要单击 clslogin 类中的 登录 如何遍历找到登录名 我正在使用 C 和 selenium Webdriver 使用 XPath html body div table tbody tr 1 td
  • 它如何获得比我想要的更多的内存?(C++)[重复]

    这个问题在这里已经有答案了 我想要一个1整数内存 但是这个程序如何工作呢 Code include
  • Passport-jwt 令牌过期

    我正在使用 Passport jwt 生成我的令牌 但我注意到令牌永远不会过期 有没有办法根据为我设置的规则使特定令牌失效 例如 use strict const passport require passport const passpo
  • 为python配置Vs code 2.0.0版本构建任务

    我需要帮助来配置我的 Vs 代码以使用 Cntrl Shift B 在 python 中运行脚本 我工作得很好 直到 Vs 代码升级到版本 2 0 0 现在它要求我配置构建 我不知道构建是什么 过去 当我只需要配置任务运行程序时 它效果很好
  • 计算圆交点 O( (n+s) log n)

    我试图弄清楚如何设计一种算法 可以以 O n s log n 复杂度完成此任务 s 是交叉点的数量 我尝试在互联网上搜索 但找不到真正的东西 无论如何 我意识到拥有良好的数据结构是关键 我在java中使用红黑树实现 TreeMap 我还使用
  • Solr 索引 My SQL 时间戳或日期时间字段

    要在 Solr 中索引日期 日期应采用 ISO 格式 我们可以在不修改 SQL Select 语句的情况下索引 MySQL Timestamp 或 Date Time 字段吗 我用过
  • 如何使用 Flask 和 sqlalchemy 进行选择查询?

    我是 Flask 和 SQLAlchemy 的新手 我在 postgress 有一个数据库 该数据库有表 数据 200 条记录 我想做一个 Select 语句 但当我这样做时总是给我同样的错误 这是我的代码 这是我的模型 py from s
  • DateTime.AddYears 在闰年的行为

    在 DateTime 上使用 AddYears 方法时 任何人都可以解释 NET 中闰年计算背后的数学或简单推理吗 如果您将 2012 年 2 月 29 日加上一年 您将得到 2013 年 2 月 28 日 而不是 2013 年 3 月 1
  • 如何在 Scala 中为泛型类型提供默认类型类?

    在 Scala 中 如果你创建一个类型类 比如代数结构Monoid T 您可以为不同类型的幺半群提供许多默认类型类实现 假设幺半群定义为 trait Monoid T def op x T y T T def id T Since Stri
  • 具有三个表的递归 CTE

    我正在使用 SQL Server 2008 R2 SP1 我想通过 沿着树向上走 来递归地找到某个组织单位的第一个非空经理 我有一张包含组织单位 ORG 的表 一张包含每个组织的父级的表 ORG 中的单位 我们将该表称为 ORG PAREN