Найти минимальное

 
0
 
Oracle
ava
proger | 13.10.2005, 13:42
В базе есть таблица где id такие: 1,2,3,5,6
Вот как найти минимальное число, которого нет в базе, т.е. 4, только это надо сделать в запросе!
Comments (11)
ava
LSD | 13.10.2005, 12:49 #
А почему не 0, его ведь тоже нет среди ID?
Почетче сформулируй вопрос.
ava
proger | 13.10.2005, 12:56 #
Цитата (LSD @ 13.10.2005, 12:49)
А почему не 0, его ведь тоже нет среди ID?

Почетче сформулируй вопрос.

Можно и 0.
Надо найти в базе минимальное число, которое отсутствует!
ava
LSD | 13.10.2005, 12:57 #
select min(ID)-1 from my_table
ava
proger | 14.10.2005, 13:55 #
Цитата (LSD @ 13.10.2005, 12:57)
select min(ID)-1 from my_table

А если такие 0,1,2,4,5
ava
igon | 16.10.2005, 00:34 #

select min(a.id)+1
from my_table a Left Join my_table b On a.id+1 = b.id
Where b.id Is Null

Если "дырок" нет, вернет max(id)+1.
Если 0 не будет, его тоже не вернет :(
Более того, не вернет и 1, если последовательность твоих ID начинается с 2 (2,4,5).
Т.е. корректно будет работать, если "дырка" "обрамлена" с ДВУХ сторон.
ava
proger | 17.10.2005, 11:40 #
Цитата (igon @ 16.10.2005, 00:34)


select min(a.id)+1

  from my_table a Left Join my_table b On a.id+1 = b.id

  Where b.id Is Null



Если "дырок" нет, вернет max(id)+1.

Если 0 не будет, его тоже не вернет :(

Более того, не вернет и 1, если последовательность твоих ID начинается с 2 (2,4,5).

Т.е. корректно будет работать, если "дырка" "обрамлена" с ДВУХ сторон.

А подробнее описать твой запрос не можешь, обьяснить?
ava
LSD | 17.10.2005, 12:43 #
Цитата (proger @ 17.10.2005, 12:40)
А подробнее описать твой запрос не можешь, обьяснить?

Этот запрос вначале найдет все дырки, выберет минимальную из них и вернет значние на 1 больше.
ava
igon | 17.10.2005, 15:15 #
Цитата
Этот запрос вначале найдет все дырки, выберет минимальную из них и вернет значние на 1 больше.

Почти так, только 1 прибавляется не к найденной минимальной "дырке", а к минимальному ID, для которого при объединении таблицы самой с собой не найден ID, больший на 1.
Для 1,2,4,5 запрос

select a.id, b.id
from my_table a Left Join my_table b On a.id+1 = b.id

вернет

a.ID | b.ID
---------
1 | 2
2 | 3
3 | null
5 | 6
6 | null

Left [Outer] Join работает так, что
Цитата
For all rows in A that have no matching rows in B, Oracle returns null for any select list expressions containing columns of B

Т.е. запрос можно "прочитать" так: "Для каждого ID из A вывести его значение и значение ID из B, для которого выполняется условие a.id+1 = b.id. Если условие не выполняется ("дырка"), вывести null.
При помощи

Where b.id Is Null

оставляем только записи, у a.ID которых рядом - "дырка". min(a.ID) дает наименьший такой ID. Прибавление к нему 1 и дает искомое
Цитата
минимальное число, которого нет в базе.
ava
Paradox | 21.10.2005, 10:29 #
а если 1 2 5 6 ??? smile
ava
LSD | 21.10.2005, 10:42 #
Цитата (Paradox @ 21.10.2005, 11:29)
а если 1 2 5 6 ???

Вернет 3. А в чем собстевенно вопрос?
ava
Paradox | 22.10.2005, 05:00 #
да ни в чем
невнимательно глянул первый раз
думал обсуждается алгоритм поиска дырок smile
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
  Paradox ava  LSD   proger   igon
advanced
Submit