Nic*_*ick 4 sql database sql-server algorithm
假设我的下表有三列:
id | start_block | end_block
-----------------------------
01 | 00000000001 | 00000000005
02 | 00000000006 | 00000000011
03 | 00000000012 | 00000000018
04 | 00000000025 | 00000000031
05 | 00000000032 | 00000000043
Run Code Online (Sandbox Code Playgroud)
每行是"开始块"和"结束块".如果数据是完美的,那么每个起始块将比它之前的结束块多一个.因此,对于行id == 02,起始块为6,而前面的行为5的结束块.
我需要查询这些数据(它是成千上万行)并找到任何缺失的行.根据我的示例数据,03和04之间应该有一行,其起始块为19,结束块为24.
我正在尝试在JSP中构建一个报告来协调这些数据并找到丢失的行.执行此操作的丑陋方法是将整个记录集拉入数组并执行类似于每一行的操作:
if ((arry(i,1) + 1) != (arry(i+1),1)( {
print("Bad Row!\n");
}
Run Code Online (Sandbox Code Playgroud)
但是,我真的希望能够直接查询记录集并返回我需要的内容.那可能吗?如果没有,有人能指出我正确的方向创建一个存储过程,做我需要的吗?
hov*_*ova 10
试一试,肯定不会受伤
CREATE TABLE #t (startz INT, zend INT)
insert into #t (startz, zend) values (1,5)
insert into #t (startz, zend) values (6,11)
insert into #t (startz, zend) values (12,18)
insert into #t (startz, zend) values (25,31)
insert into #t (startz, zend) values (32,43)
select * from #t ta
LEFT OUTER JOIN #t tb ON tb.startz - 1 = ta.zend
WHERE tb.startz IS NULL
Run Code Online (Sandbox Code Playgroud)
最后的结果是误报.但容易消除.