вторник, 8 февраля 2011 г.

SQL Поиск дырок

Задача:  в последовательности айдишников найти пропуски.

Пример 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)