名词解释
坏数:例如,连续生成的数字是由某一操作(通常删除)生成的,并且产生不连续的数字。我们称这个间断数为破数。
例如,数据库中有一个叫场合同号,为201106_011正常的格式(2011年6月第十一的合同说,合同号)然后在它的前面应该201106_10,后应201106_12,当我们删除201106_011 201106_010合同会直接出现的背后是201106_012,这种情况叫错号。
在传统的系统中,断号的情况非常普遍,例如数据库中的列是增量式类型。当删除一行时,会出现一个损坏的数字,但是客户经常要求一个需求,而他们不想打破这个数字。
问题很简单,解决方法很简单:
编写一个C #方法获取下一个记录数:
复制代码代码如下所示:
公共静态int GetNextNumber(int { } inumlist)
{
国际itempstr = inumlist { 0 }; / /在一个临时变量保存的记录号
对于(var i = 0;i < inumlist。长1;i++)
{
如果(i = 0)
{
itempstr = inumlist {我};
}
如果破碎了,就断了。
如果(((inumlist {我} - itempstr)> 1)
{
返回itempstr + 1;
}
其他的
{
itempstr = inumlist {我};
}
继续;
}
inumlist { 1 }返回inumlist.length + 1;
}

当然,这个代码也可以用下面的形式编写:
复制代码代码如下所示:
public static int getnextnumber3(int { } inumlist)
{
为(int i = 0,J = 1;J < inumlist。长1;i++,j++)
{
如果破碎了,就断了。
如果(((inumlist { } { } J - inumlist)> 1)
{
返回inumlist {我} + 1;
}
}
inumlist { 1 }返回inumlist.length + 1;
}

测试代码如下所示:
复制代码代码如下所示:
static void main(String { } args)
{
inums int { } = { 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));
}


结果如下:
U3000 U3000
U3000
前几天接触到这个问题了,因为一个特殊的场景,用C #会增加开发难度,如果思想是通过SQL。
建立数据和制造数据SQL:
复制代码代码如下所示:
创建表的数据
(
主键的代码
)

插入数据(代码)值(1)
插入数据(代码)值(2)
插入数据(代码)值(3)
插入数据(代码)值(4)
插入数据(代码)值(5)
插入数据(代码)值(6)
插入数据(代码)值(7)
插入数据(代码)值(8)
插入数据(代码)值(9)
插入数据(代码)值(10)

然后再次删除第三,第七,第八行数据,以便三行被打破。
从代码中删除数据(3,7,8)
分析:为了生成一个公司,即使代码在这个列中连续,通常在两行代码之间是1。
因为代码从1开始(从其他数字,它也是相同的计算),也就是说,代码是从小到大,代码是1。行应该是第一行,而代码为10的行是第十行,也就是代码行数。
在这种情况下,预览数据如下所示:
整理前删除数据:
整理后删除数据:

很明显,在删除数据之前,代码=行号被删除,代码不等于等号。数据删除后的第一行代码不等于行号数据,即第一个断开数据的数据,这就是我们要查询的结果。
例如,如果数据库中有一个损坏的标志,下面的语句可以通过以下语句直接检测到:
U3000 U3000
结果是现在。
在这个代码,这是一个缺陷,这种方法是专门处理一个破碎的迹象的情况下,应回到马克斯(rownumber)+ 1如果没有破裂的迹象。正确的代码如下:

到目前为止,我今天要谈的基本上已经结束了。在这里我们借用SQL2005 row_number方法。在其他数据库中也有类似的方法,因此我们可以自己探索它。
问题完全解决了吗你可以看到,超过这个数,挑选从童年,如3、7、8和故障数,填了3。如果客户要求从开始的标志(即3,7,8掉大量,填8),如何处理
首先通过C #法操作方式简单,这里的SQL处理方法的主要思想:
U3000 U3000
那么,扩大,你如何找出所有的破数
为了实现这个功能,一般的想法是比较当前代码与前一行的代码,但是因为可能有连续的中断号码(例如,删除代码= 7, 8, 9,三行)。
我的解决方案是,如果max(代码)等于100,那么我首先构造100行(如何)数据库只需查找一个大于100的行号,选择上面的100行,如果不超过100个表,联合查询构建100行),而100行数分别与代码比较,如果有一行代码>行,例如,哪里有断裂。以下:
假设系统中有另一个表A,它的总行数> max(代码)。{注意:当然,如果没有这样的表,它也可以通过select来构造。}
查询所有损坏的SQL,如下所示:
U3000 U3000
U3000 U3000
到目前为止,问题在于,上面的代码只有一个SQL语句,而不需要使用存储过程、用户自定义函数或环C #,我们可以解决所有的问题,为了打破,当然,性能的优化,这是不上市。