Let's say I have the following table with three columns:
id | start_block | end_block
-----------------------------
01 | 00000000001 | 00000000005
02 | 00000000006 | 00000000011
03 | 00000000012 | 00000000018
04 | 00000000025 | 00000000031
05 | 00000000032 | 00000000043
Each row was a "Start Block" and an "End Block". If the data was perfect, each start block would be one more than the end block before it. So, for row id == 02, the start block is 6 while the end block for the row before it 5.
I need to query this data (it's tens of thousands of row) and find any missing rows. According to my sample data, there should be a row in between 03 and 04 that has a start block of 19 and an end block of 24.
I'm trying to build a report in JSP to reconcile this data and find the missing rows. The ugly way to do this would be to pull the whole recordset into an array and do something like on every row:
if ((arry(i,1) + 1) != (arry(i+1),1)( {
print("Bad Row!\n");
}
But, I would really like to be able to query the recordset directly and return what I need. Is that possible? If not, could someone point me in the right direction of creating a stored proc that does what I need?
Here is a SQL that actually tells you the missing rows!
Did it quite fast so ignore performance issues:
Based on:
Although I'd say this is a reasonable candidate for iterating through the result in TSQL: you're going to have to scan the entire table (or at least the entirety of indices on
start_block
andend_block
) anyway, so looping through just once and using variables to remember the last value is something to aim for.This assumes the IDs in the table are sequential. If they are not sequential then you have to do some complicated linking with Start_Block to End_Block to link the two blocks adjacent to each other.
Sure wouldn't hurt to give it a try
The last result is a false positive. But easy to eliminate.
would give you the blocks immediately preceding a gap. You could get fancy. Let's see...
I think that ought to do it.
You could try: