SQL вопрос по select (вроде не сложный)

yallow
Дата: 04.03.2011 19:17:35
Привет,

Помогите написать select, пожалуйста.

Есть таблица в ней поле Integer, поле уникально.

Нужно найти наименьшее пропущенное число в введнном диапозоне (от 1 до 100).
Например, для значений поля {1,2,6,7,9,11} select должен вернуть 3.
Для {2,5} вернуть 1. и.т.д.

Написать надо только внутри select.

Надеюсь понятно объяснил.

Пример таблицы (на всяк случай)
ID Поле
1 1
2 3
3 4
4 6
5 88

здесь select должен вернуть 2.

Надеюсь это возможно.

Спасибо большое!!!
-2-
Дата: 04.03.2011 19:26:08
yallow,

а если нет 1, то возвращать 1?
yallow
Дата: 04.03.2011 19:27:36
Ага.
-2-
Дата: 04.03.2011 19:27:43
select nvl(max(n),0)+1
from t
start with n=1
connect by n=prior n+1
yallow
Дата: 04.03.2011 19:28:35
Спасибо, сейчас попробую.
yallow
Дата: 04.03.2011 19:44:52
какой-то жутко медленный запрос вышел -

select nvl(max(fieldid),0)+1
from field
where schemaid = 2833
start with fieldid=600000000
connect by fieldid=prior fieldid+1;

SQL developer уже минут 10 думает.

select count(*) from field where schemaid = 2833;
80
orawish
Дата: 04.03.2011 20:00:14
yallow
какой-то жутко медленный запрос вышел -

..

а вы найдите десять отличий между тем, что вы спрашивали (и на что вам ответили),
и тем, что вы вытворяете.

сессию прибейте, пока не началось
-2-
Дата: 04.03.2011 20:04:09
select nvl(max(fieldid),0)+1
from field
--where schemaid = 2833
start with fieldid=600000000 and schemaid = 2833
connect by fieldid=prior fieldid+1 and fieldid between 1 and 100;
Elic
Дата: 04.03.2011 21:54:19
-2-,
... нефритовый ... и т.п. :)

yallow,
STFF Заполнение дырок
yallow
Дата: 06.03.2011 23:41:58
Спасибо.

Попробовал варианты, что люди предлагали на форуме. Они работают, но мне надо немного адаптировать запрос - мне нужно обязательно задавать диапозон.

Например, оба запроса работают правильно если считать надо с единицы -

select coalesce(min(case when fieldid <> must_be_id then must_be_id end), max(fieldid) + 1, 1)
        from
        ( select fieldid, row_number() over (order by fieldid) as must_be_id
            from field where schemaid=2784
        );
select min(fieldid)+1 from (
select fieldid,lead(fieldid-1,1,fieldid) over (order by fieldid) l from field where schemaid=2784)
where fieldid<>l;

Но как мне теперь задать, что я хочу найти дырки в диапозоне от 100 до 200, например?
Причем если диапозон пустой, то выдавать нижнюю границу (100), а если полный - то NULL.

Огромное спасибо и прошу прощения если для кого-то это как семечки и я трачу их время.