首页 > 数据库 >sqlserver递归排序

sqlserver递归排序

时间:2023-10-06 21:11:37浏览次数:44  
标签:13 递归 union sqlserver LevelOrder sequences 排序 select

主要介绍了sqlserver递归排序相关的知识,希望对你有一定的参考价值。

此算法不支持无限递归,只支持指定最大层级,实际应用中,一般不会超过5级,sqlserver最大只支持100级。

递归层级LevelOrder序号,每层级最大序号sequences,

子级序号=父级序号+父级序号/最大序号

即LevelOrder=p.LevelOrder+p.LevelOrder/sequences

说明:每级最大序号为10,LevelOrder递归如果为5级,即10000(即有最小5位数,因为每递归一级,除10少一个0),如果为6级即LevelOrder100000(即有6位数),每级最大序号为10

示例代码:

declare @LevelOrder int=10000,@sequences int=10
declare @t table
(
  Id int, Name varchar(max), ParentId int
);
insert into @t
select 1,'一级1',0 union all
select 2,'二级1',1 union all
select 3,'三级1',2 union all
select 4,'三级2',2 union all
select 5,'三级4',2 union all
select 6,'四级1',3 union all
select 7,'四级2',3 union all
select 9,'四级3',4 union all
select 10,'四级4',4 union all
select 11,'一级2',0 union all
select 13,'三级5 ',12 union all
select 12,'二级2',11 union all
select 14,'三级标记',12 union all
select 15,'四级11',13 union all
select 16,'四级12',13 union all
select 17,'四级13',13 union all
select 18,'四级14',13 union all
select 18,'四级15',13 union all
select 18,'四级16',13 union all
select 18,'四级17',13 union all
select 18,'四级18',13 union all
select 18,'四级19',13 union all
select 18,'四级20',13 union all
select 18,'四级21',13
;WITH recursiveOrder AS
(
SELECT Id,
    Name,
    ParentId,
    (ROW_NUMBER()over(order by GETDATE()) * @LevelOrder) AS LevelOrder,
    @LevelOrder AS sequences
FROM @t
WHERE ParentId =0

UNION ALL

SELECT si.Id,
    si.Name,
    si.ParentId,
    (p.LevelOrder + ROW_NUMBER()over(order by GETDATE()) * p.sequences/ @sequences) as LevelOrder,
    (p.sequences / @sequences) as sequences
FROM @t si INNER JOIN recursiveOrder p
ON si.ParentId = p.Id
)
SELECT * FROM recursiveOrder ORDER BY LevelOrder

如果你的最大序号很大,计算LevelOrder位数为递归层级*(序号位数-1)

例如:

1.最大序号为10,递归层级为5,5*(2位数-1)=5位数,LevelOrder为10000

2.最大序号为100,递归层级为5,5*(3位数-1)=10位数,LevelOrder为1000000000

带缩进显示

;WITH recursiveOrder AS
(
SELECT Id,
    Name,
    ParentId,0 Step,
    (ROW_NUMBER()over(order by GETDATE()) * @LevelOrder) AS LevelOrder,
    @LevelOrder AS sequences
FROM @t
WHERE ParentId =0

UNION ALL

SELECT si.Id,
    si.Name,
    si.ParentId,p.Step+1,
    (p.LevelOrder + ROW_NUMBER()over(order by GETDATE()) * p.sequences/ @sequences) as LevelOrder,
    (p.sequences / @sequences) as sequences
FROM @t si INNER JOIN recursiveOrder p
ON si.ParentId = p.Id
)
SELECT Id,REPLICATE(' ', Step) + name FROM recursiveOrder ORDER BY LevelOrder

 

以上是关于sqlserver递归排序的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver递归排序

ms sql 2005 递归查询如何实现

SQL问题 实现递归查询

sqlserver函数中引用递归

记一次SqlServer骚操作——递归

谁可以给个sqlserver2005两张表之间的递归查询,我看网上都是一张表两个字段之间递归查询.

标签:13,递归,union,sqlserver,LevelOrder,sequences,排序,select
From: https://www.cnblogs.com/waw/p/17745012.html

相关文章

  • SQLServer数据库三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式介绍
    SQLServer数据库三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式介绍  1.Simple简单恢复模式,Simple模式的旧称叫”Checkpointwithtruncatelog“,其实这个名字更形象,在Simple模式下,SQLServer会在每次checkpoint或backup之后自动截断log,也就是丢弃所有的in......
  • MSSQLSERVER执行计划详解
    转自:https://www.cnblogs.com/knowledgesea/p/5005163.html1.序言本篇主要目的有二:看懂t-sql的执行计划,明白执行计划中的一些常识。能够分析执行计划,找到优化sql性能的思路或方案。如果你对sql查询优化的理解或常识不是很深入,那么推荐几篇博文给你:SqlServer性能检测和优化......
  • WIN11 安装 SQL Server 2019,SQLSERVER2022, MYSQL 8.0 ,Docker,Mongodb失败故障分析
    最近研究数据库性能调优遇到各种数据库各种装不上,不知道熬了多少根软白沙,熬了多少颗张三疯,问了多少AI,查了多少网页,熬了两天,终于搞明白了一件事:那就是WIN11ONARM(因为拿的是MACPROM2做.NET平台开发安装)SQLSERVER2019,SQLSERVER2022,MYSQL8.0,Docker,Mongodb失败故障分析,最终极......
  • 快速排序
    #include<algorithm>#include<functional>usingnamespacestd;intmain(){inta[]=(1,3,2,9,-4};sort(a,a+5);//从小到大排房sort(a,a+5,less<int>());//与上一条语句相同sort(a,a+5,greater<int>());//大到小排return0;......
  • 手工升级ACCESS到SQLSERVER
    1、必须先安装MicrosoftOfficeAccess2003,和SQLServer2000。 2、把旧的数据库备份,备份完成后,用Access2003打开MDB数据库,在打开时会出现一个警告,不要理会它(安全警告),按打开键,打开后按工具栏——数据库实用工具——转换数据库——转换为2002-2003格式,把数据库转换成2003格式......
  • 字符串排序
    方法1:直接用数组排序publicclassStringSort{publicstaticvoidmain(String[]args){String[]strings={"abc123","abc+1234","ababab--1"};//对每个字符串计算字母字符个数和数字字符个数,并按照字母数字比和字符串本身大小排序Arra......
  • 归并排序原理、演示及代码
    归并排序1.原理归并排序是一种排序算法,它通过将待排序的数组或列表递归分割成较小的子数组,然后将这些子数组合并以生成一个有序的数组。2.操作分割(Divide):将待排序的数组分成两个大致相等的子数组,或者将列表分成两部分。这个过程是递归的,直到每个子数组或子列表都只包含一个元......
  • 【C语言入门】快速排序函数的应用
    快速排序函数qsortvoidqsort(void*base,typenitems,typesize,int(cmp)(constvoid*p1,constvoid*p2));参数说明:base  指针要排序的数组的首元素指针nitems  数组元素的总个数size  数组中每一个元素的字节大小cmp  函数指针(用来比较两个元素的函数)比......
  • 为什么处理已排序数组比处理未排序数组更快?
    在这个C++代码中,在计时区域之前对数据进行排序(*)使得主循环快6倍:#include<algorithm>#include<ctime>#include<iostream>intmain(){//生成数据constunsignedarraySize=32768;intdata[arraySize];for(unsignedc=0;c<arraySize;++c)......
  • c语言代码(递归)练习23
    需求:求解用户给的第几位斐波那契数,斐波那契数1,1,2,3,5,9,13,22,35,55....:这位数等于前两位数相加。#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intayue(inti){if(i<=2){return1;}else{returnayue(i-1)+......