首页 > 数据库 >SQLServer数据库里的递归CTE详细说明

SQLServer数据库里的递归CTE详细说明

时间:2024-11-20 17:45:24浏览次数:1  
标签:层级 递归 COMPID SQLServer BOMNO CTE BOM

 

SQLServer数据库里的递归CTE详细说明

 

 

用实例来说明:

样例: 

-- 解释CTE递归的运算逻辑(代码不一定可用,但逻辑准确)
WITH BOM_CTE AS (

    -- 基础层(B段):选择特定BOM物料编码的所有BOM条目,并设置层级为1
    SELECT BOMNO AS 'TopBOM', COMPID, REQQTY
           , 1 AS Level, BOMNO AS 'ParentID' 
    FROM [BOM] B
    WHERE  BOMNO = 'ABC00001'

    UNION ALL

    -- 递归层(d段):展开下一层BOM,并增加层级
    SELECT B.BOMNO AS 'TopBOM', d.COMPID,(d.REQQTY * cte.REQQTY) AS REQQTY
           ,cte.Level + 1, d.BOMNO AS 'ParentID' 
    FROM [BOM] d
    INNER JOIN BOM_CTE cte ON d.COMPID = cte.COMPID

)
-- 最终选择:只选择最底层物料,并包括层级信息
SELECT TopBOM AS '顶层BOM',Level, COMPID AS '组件物料', REQQTY AS'组件用量',ParentID AS'组件的上层物料'
FROM BOM_CTE
OPTION (MAXRECURSION 10);

 

/*  
    假设 [BOM] 表的结构是 BOMNO、COMPID、REQQTY; 
    其中 BOMNO是COMPID的直接上层物料(而不是下层物料),REQQTY是COMPID在该BOMNO里的单位用量。
    --用某个产品物料编码 ABC00001 来做测试。
*/

  

样例讲解: 

在SQL Server中,递归公共表表达式(CTE)的执行顺序遵循以下步骤:

1. **基础层(B段)**:
- 递归的起点是基础层,这是递归CTE的第一部分。在您的情况下,基础层是选择特定BOM物料编码`ABC00001`的所有BOM条目,并设置层级为1。
- 这个查询首先执行,返回所有顶层BOM条目,这些条目将作为递归的起点和基础,所以叫基础层。

2. **第一次递归层(d段)**:
- 第一次递归层的执行将基础层的结果作为输入。
 它将从`[BOM]`表中选择那些`BOMNO`与基础层返回的`COMPID`相匹配的条目,并计算层级为2。
- 这一步将返回第一层子组件及其对应的层级。

3. **第二次递归层(d段)**:
- 第二次递归层的执行将第一次递归层的结果作为输入。
  它将再次从`[BOM]`表中选择那些`COMPID`与第一次递归层返回的`BOMNO`相匹配的条目,并计算层级为3。
- 这一步将返回第二层子组件及其对应的层级。

4. **第三次递归层(d段)**:
- 第三次递归层的执行将第二次递归层的结果作为输入。它将从`[BOM]`表中选择那些`COMPID`与第二次递归层返回的`BOMNO`相匹配的条目,并计算层级为4。
- 这一步将返回第三层子组件及其对应的层级。

5. **后续递归层(d段)**:
- 递归层将继续执行,直到没有更多的子组件可以匹配,即`COMPID`不再作为任何其他条目的`BOMNO`出现。

6. **最终选择(CTE查询段)**:
- 一旦所有的递归层都执行完毕,最终选择将从整个递归CTE(包括基础层和所有递归层)中选择最底层物料。
- 这个查询将检查每个`COMPID`是否不再作为任何其他BOM条目的`BOMNO`出现,如果是,则认为它是最底层物料,并返回这些物料及其层级。

递归CTE的执行顺序是从基础层开始,逐层递归,直到无法继续递归为止,然后执行最终选择来返回结果。每次递归层的执行都是基于前一次递归层的结果。这个过程会持续进行,直到所有可能的递归层都被处理完毕。

 

·

 

标签:层级,递归,COMPID,SQLServer,BOMNO,CTE,BOM
From: https://www.cnblogs.com/05-hust/p/18558919

相关文章

  • Impact of Non-Standard Unicode Characters on Security and Comprehension in Large
    本文是LLM系列文章,针对《ImpactofNon-StandardUnicodeCharactersonSecurityandComprehensioninLargeLanguageModels》的翻译。非标准Unicode字符对大型语言模型中安全性和理解性的影响摘要1引言2背景和相关工作3方法4对大语言模型的影响5跨语......
  • 递归定义
    GNU“GNU”是“GNU'sNotUnix!”(GNU并非Unix!)的首字母递归缩写。平衡二叉树也叫AVL树,它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和左子树的高度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。 前序遍历(preordertraversal)首先......
  • SqlServer运维——重建索引
    目录0.什么是重建索引1.什么时候需要重建索引2.如何重建索引:重建索引和删除原索引后再创建新索引3.如何重建索引4.创建重建索引的定时作业5.附录0.什么是重建索引如果表中记录频繁地被删除或插入,尽管表中的记录总量保持不变,索引空间的使用量会不断增加。虽然记录从索引......
  • WPF ListBox implement autoscroll via behavior extension and SelectedItem
    publicclassListBoxAutoScrollBehavior:Behavior<ListBox>{protectedoverridevoidOnAttached(){AssociatedObject.SelectionChanged+=AssociatedObject_SelectionChanged;base.OnAttached();}privatevoidAs......
  • MySQL进阶:SQL高级技巧 - CTE和递归查询
    ......
  • SqlServer数据库恢复备份数据的方法
    一、如何备份 二、开始还原当时在公司是要将阿里云的sqlserver中的数据备份一份到公司内网数据库,并将数据恢复到公司内网SqlServer数据库,当我按照原库的要求创建了新的空库。在SSMS控制台还原的时候,它竟然报错,报:system.data.sqlclient.Sqlerror:备份集中的数据库备份与现......
  • Oracle,PostgreSQL,MySql,SqlServer各数据库查元信息的SQL
    Oracle查询表字段信息SELECTa.COLUMN_NAMEASB_NAME,--字段名称a.DATA_TYPE,--字段数据类型CASEWHENa.COLUMN_NAMEIN(SELECTcols.column_nameFROMall_constraintscons,all_cons_columnsco......
  • 基于JavaSwing开发问卷调查系统源码(SQLServer数据库) 课程设计 大作业
    ......
  • 递归实现快速排序的三种方法
    快速排序的定义快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所......
  • 【C语言】函数递归
    1、递归的概念    其实我们在前面的学习中已经使用过函数的递归了。那么什么是递归呢    递归是一种解决问题的方法,就是函数自己调用自己,例如下面的函数。         上面就是一个简单的函数递归,在main函数内调用自己。2、递归的使用思路和......