Задача: в последовательности айдишников найти пропуски.
Пример 1: Дырка в одну цифру.
В таблице "_IDCHECK" нужно
Найти 6.
Наверное проще всего это сделать при помощи left outer join.
Джоиним таблицу саму с собой со сдвигом на 1.
Чтобы понять как это работает сначала посмотрим результаты такого запроса
select a.id, b.id
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
Осталось выбрать столбцы где b.id == null
select a.id+1
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
where b.id is null
И убрать последнее значение
select a.id+1
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
where b.id is null and a.id<(select max(id) from "_IDCHECK" )
ЗЫ: тоже самое можно написать через select
select a.id+1 from "_IDCHECK" as a
where not exists(select * from "_IDCHECK" as b where b.id=a.id+1)
Пример 1: Дырка в одну цифру.
В таблице "_IDCHECK" нужно
Найти 6.
Наверное проще всего это сделать при помощи left outer join.
Джоиним таблицу саму с собой со сдвигом на 1.
Чтобы понять как это работает сначала посмотрим результаты такого запроса
select a.id, b.id
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
Осталось выбрать столбцы где b.id == null
select a.id+1
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
where b.id is null
И убрать последнее значение
select a.id+1
from "_IDCHECK" as a
left outer join "_IDCHECK" as b on (a.id+1) = (b.id)
where b.id is null and a.id<(select max(id) from "_IDCHECK" )
ЗЫ: тоже самое можно написать через select
select a.id+1 from "_IDCHECK" as a
where not exists(select * from "_IDCHECK" as b where b.id=a.id+1)