Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Найти минимальное


Автор: proger 13.10.2005, 12:42
В базе есть таблица где id такие: 1,2,3,5,6
Вот как найти минимальное число, которого нет в базе, т.е. 4, только это надо сделать в запросе!

Автор: LSD 13.10.2005, 12:49
А почему не 0, его ведь тоже нет среди ID?
Почетче сформулируй вопрос.

Автор: proger 13.10.2005, 12:56
Цитата(LSD @ 13.10.2005, 12:49)
А почему не 0, его ведь тоже нет среди ID?
Почетче сформулируй вопрос.

Можно и 0.
Надо найти в базе минимальное число, которое отсутствует!

Автор: LSD 13.10.2005, 12:57
Код
select min(ID)-1 from my_table

Автор: proger 14.10.2005, 13:55
Цитата(LSD @ 13.10.2005, 12:57)
Код
select min(ID)-1 from my_table

А если такие 0,1,2,4,5

Автор: 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 не будет, его тоже не вернет smile
Более того, не вернет и 1, если последовательность твоих ID начинается с 2 (2,4,5).
Т.е. корректно будет работать, если "дырка" "обрамлена" с ДВУХ сторон.

Автор: 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 не будет, его тоже не вернет smile
Более того, не вернет и 1, если последовательность твоих ID начинается с 2 (2,4,5).
Т.е. корректно будет работать, если "дырка" "обрамлена" с ДВУХ сторон.

А подробнее описать твой запрос не можешь, обьяснить?

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

Этот запрос вначале найдет все дырки, выберет минимальную из них и вернет значние на 1 больше.

Автор: 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 и дает искомое
Цитата
минимальное число, которого нет в базе.

Автор: Paradox 21.10.2005, 10:29
а если 1 2 5 6 ??? smile

Автор: LSD 21.10.2005, 10:42
Цитата(Paradox @ 21.10.2005, 11:29)
а если 1 2 5 6 ???

Вернет 3. А в чем собстевенно вопрос?

Автор: Paradox 22.10.2005, 05:00
да ни в чем
невнимательно глянул первый раз
думал обсуждается алгоритм поиска дырок smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)