• 售前

  • 售后

热门帖子
入门百科

用一句SQL办理SQL中断号题目 保举

[复制链接]
yslzaity 显示全部楼层 发表于 2021-10-26 13:12:28 |阅读模式 打印 上一主题 下一主题
名词表明  断号:比如,连续天生的编号,由于某种操作(通常为删除)后,产生不连续的编号,我们将这种不连续的编号称为断号。  例如,数据库中有一个字段叫条约编号,正常格式为201106_011(表现2011年6月的第11个条约),那么它前面的一个条约编号应该为201106_10,后面的一个应该为201106_12,当我们删除了条约201106_011,就会出现201106_010后面直接是201106_012,这种环境下叫做断号。  传统系统中,像这种断号的环境很常见,比如数据库中的列为递增类型,当删除某行后,就会出现断号,而经常有客户提出需求,不渴望出现断号的环境。办理方案通常就是,假如删除了某行数据,那么下次新增时,应该将断号补齐。      标题很简朴,办理方法也很简朴:      写一个C#方法,用来获取下一条记录的编号:
复制代码 代码如下:
public static int GetNextNumber(int[] iNumList)
{
int iTempStr = iNumList[0]; //用一个暂时变量生存上一条记录的编号
for (var i = 0; i < iNumList.Length - 1; i++)
{
if (i == 0)
{
iTempStr = iNumList;
}
//假如出现断号,则补齐断号
if ((iNumList - iTempStr) > 1)
{
return iTempStr + 1;
}
else
{
iTempStr = iNumList;
}
continue;
}
return iNumList[iNumList.Length - 1] + 1;
}

固然,这段代码也可以简写为以下情势:
复制代码 代码如下:
public static int GetNextNumber3(int[] iNumList)
{
for (int i = 0, j = 1; j < iNumList.Length - 1; i++, j++)
{
//假如出现断号,则补齐断号
if ((iNumList[j] - iNumList) > 1)
{
return iNumList + 1;
}
}
return iNumList[iNumList.Length - 1] + 1;
}

测试代码如下:
复制代码 代码如下:
static void Main(string[] args)
{
int[] iNums = { 1, 2, 4, 5, 6, 9, 10 }; //删除了数组中的3,7,8,即3,7,8为断号,下次新增时,渴望产生的断号为3
System.Console.WriteLine(BreakNumber.GetNextNumber3(iNums));
System.Console.WriteLine(BreakNumber.GetNextNumber(iNums));
}

运行效果如下:   前几天再次接触到这个标题,由于特别的场景,再用C#反而会增长开发难度,假如想法通过SQL来办理标题:
建表及制造数据SQL:
复制代码 代码如下:
CREATE TABLE testTable
(
Code int primary key
)

INSERT INTO testTable(Code) VALUES (1)
INSERT INTO testTable(Code) VALUES (2)
INSERT INTO testTable(Code) VALUES (3)
INSERT INTO testTable(Code) VALUES (4)
INSERT INTO testTable(Code) VALUES (5)
INSERT INTO testTable(Code) VALUES (6)
INSERT INTO testTable(Code) VALUES (7)
INSERT INTO testTable(Code) VALUES (8)
INSERT INTO testTable(Code) VALUES (9)
INSERT INTO testTable(Code) VALUES (10)

然后再同样删除第3、7、8行的数据,使这三行产生断号:
DELETE FROM testTable WHERE Code in (3,7,8)
分析:要产生连号,便是要让Code这一列上连续的,也就是说通常两行之间的Code相差为1
由于Code是从1开始的(从其他数字开始的也是同理盘算),即按Code从小到大排序号,Code为1的行应该为第一行,Code为10的行应该在第10行,即Code=行号,
既然如许,预览数据如下:
删除数据前的排号:      删除数据后的排号:  很显着发现,删除数据前,Code=行号,删除后Code不等于等号,而删除数据后的第一行Code不等于行号的数据,便是第一个出现断号的数据,即为我们想要查询的效果。  如是,假如数据库中有断号,则可以用以下语句直接查出断号:    效果立现。  这段代码还存在一个缺陷,即此方法专用来处理有断号的环境,假如不存在断号时,应该返回Max(RowNumber)+1。精确代码应该如下:   至此,我今天要讲的根本竣事,此处借用了SQL2005的方法row_number ,其他数据库中也有雷同的方法,各人可以自己探索。  标题完全办理了吗?各人可以发现,以上出现了断号的环境,都是从小开始补号,比如3,7,8同时为断号,则补3。假如有客户要求从大号开始补号(即3,7,8断号时,补8呢),怎么处理?  前面两种通过C#方法操作的就很容易了,这里重要说一下通过SQL处理的方法:    那么再扩展一下,如何查出所有的断号呢?  要实现这个功能,一般想法是将当前Code与上一行的Code举行对比,但由于可能出现连续断号的环境(例如删除了 Code=7、8、9三行)。此时该如何处理呢?  我的办理方法是,假如max(code)等于100,那么我先构造出100行(怎样构造?数据库中随便找个行数大于100的表,select top 100就行了,假如没有行数大于100的表,就联合查询构造出100行吧),再用这一100行的行号分别和code举行对比,假如存在Code<>行号的,即该处为断裂号,示例如下:假设系统中已经存在另一张表A,它的总行数>max(Code),【注:固然,假如不存在如许的表,也可以通过select 的方式构造出来】,查询所有断号的SQL如下:      至此,标题竣事,以上代码的长处在于只用一个SQL语句,而不需要用存储过程、用户自定义函数或C#中的循环,就可以办理各种断号标题,固然为了性能方面还可以再做优化,在此不列出。  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作