Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.04;
Скачать: CL | DM;

Вниз

Получить порядковый номер   Найти похожие ветки 

 
veb   (2006-04-08 18:29) [0]

Здравствуйте.
Подскажите, как получить первый пропущенный номер в списке номеров, если отстутствует то следующий после максимального? (1,2,3,4,8,9 ответ 5) или (1,2,3,4 ответ 5) или (4,5,6,7 ответ 1) . Когда-то видел здесь классический sql-пример, но не запомнил


 
Anatoly Podgoretsky ©   (2006-04-08 19:37) [1]

Перебор
А зачем?


 
veb   (2006-04-08 19:52) [2]

Странный вопрос.
Есть база дисков, каждый диск имеет номер. При добавлении нового диска программа, должна подсказать пользователю свободный порядковый номер.


 
Desdechado ©   (2006-04-08 21:13) [3]

а почему свободный должен быть первым пропущенным?
бери следующий за максимальным, он тоже свободный


 
veb   (2006-04-08 23:34) [4]

потому что, такая логика заполнения базы.


 
Anatoly Podgoretsky ©   (2006-04-08 23:38) [5]

Значит надо срочно задуматься об дизайне.


 
Serg1981 ©   (2006-04-09 19:41) [6]

А когда порядковый номер достигнет например типа Integer, то как к нему добавить единицу ? Нужно искать "пробелы" в базе.


 
Anatoly Podgoretsky ©   (2006-04-09 20:03) [7]

Serg1981 ©   (09.04.06 19:41) [6]
Ты надеешься этот день увидеть?


 
Anatoly Podgoretsky ©   (2006-04-09 20:03) [8]

Serg1981 ©   (09.04.06 19:41) [6]
И почему ты подумал про Integer?


 
Desdechado ©   (2006-04-09 20:06) [9]

для Оракла можно так, но это (имхо) через задний проход
SELECT rownum FROM Dba_Objects
MINUS
SELECT line_id FROM Alpha


 
veb   (2006-04-09 21:18) [10]

Сразу хочу сказать что номер диска, это вовсе не ID в таблице, поэтому я думаю не стоит вести спор о том закончится ли диапазон Id номеров в этом веке или загнутся реляционные БД.

Господа специалисты в БД, неужели никто не помнит класический пример SELECT запроса, не зависящий от СУБД или адаптированый под MSSQL?

Здесь на форуме два-три месяца назад была такая тема и там предложили штук шесть вариантов. Пожалуйста, помогите еще раз.


 
Serg1981 ©   (2006-04-09 21:39) [11]


> Ты надеешься этот день увидеть?

А если база интенсивно обновляется милионами записей в день ?


 
veb   (2006-04-09 21:45) [12]

to Serg1981
Прошу перенести свой вопрос в другую тему!


Господа специалисты в БД, неужели никто не помнит класический пример SELECT запроса, не зависящий от СУБД или адаптированый под MSSQL?

Здесь на форуме два-три месяца назад была такая тема и там предложили штук шесть вариантов. Пожалуйста, помогите еще раз.


 
Serg1981 ©   (2006-04-09 21:47) [13]

Мой вопрос и сводится к тому, чтобы искать "пробелы" в порядковых номерах, а не добавлять единицу к последнему.


 
Serg1981 ©   (2006-04-09 21:49) [14]

а на http://www.delphikingdom.ru/ не пробовал обращаться ?


 
Nikolay M. ©   (2006-04-09 22:28) [15]

Тупое решение: пронумеровать строки в НД запроса SELECT Number FROM table ORDER BY Number любым методом из ФАК-а

http://www.sql.ru/faq/faq_topic.aspx?fid=126

и выбрать минимальный номер №строки такой, что №строки <> Number с двумя проверками его на NOT NULL.
Правильный запрос писать лень.


 
veb   (2006-04-09 23:30) [16]

to Nikolay
 это жутко криво!
 было очень красиво! смысл такой:
- пересечь таблицу саму с собой по left join и по какому-то условию и выбрать, кажись, несовпадающие номера.
- взять то ли минимум, то ли максимум


 
ЮЮ ©   (2006-04-10 02:58) [17]

Ты же сам ответил в [16]

SELECT t1.Num + 1
FROM
 table t1
 LEFT JOIN table t2 ON t1.Num + 1 = t2.Num
WHERE (t2.Num IS NULL)

правда он даст только ответы:

(1,2,3,4,8,9 ответ 5)
(1,2,3,4 ответ 5)

Для контроля ситуации
(4,5,6,7 ответ 1)
достаточно анализировать
 SELECT MIN(Num) FROM Table


 
sniknik ©   (2006-04-10 08:49) [18]

и на сколько времени ты расчитываеш для добавления/подсказки одной записи, при каком размере таблици? т.е. тебя не пугает скажем минутная задержка перед "подсказкой пользователю свободного порядкового номера", при миллионе записей в таблице к примеру?

даже если записей будет не пример меньше, все одно надо чтото менять в консерватории. база у тебя однопользовательская? двух одновременно вводящих юзеров не будет гарантировано? пересечений номеров не боишся?


 
veb   (2006-04-10 09:06) [19]

to sniknik
 База у меня однопользовательская! Посмотреть ее можно здесь
http://crimeasoft.narod.ru/Download/VideoCat.exe
(такая ненавязчивая реклама, в целях, что может кто-что хорошее подскажет)
Количество записей в таблице "диски" вряд-ли превысит 1000. Поэтому огромное спасибо ЮЮ и всем кто уже не раз подал дельный совет.


 
Ega23 ©   (2006-04-10 09:25) [20]

Используй GUID и не парь мозги.


 
stone ©   (2006-04-10 09:38) [21]

Как вариант, повесить на таблицу триггер, который будет писать удаленные ID в отдельную таблицу, а при использовании его повторно, соответственно удалять из этой таблицы.


 
stud ©   (2006-04-10 13:07) [22]

ну вот на вскидку примерно, только на кой это действительно нужно?
select k1.id+1 from krp_rasp_shablon as k1
where not exists (select k2.id from krp_rasp_shablon as k2 where k2.id=k1.id+1)


 
Ega23 ©   (2006-04-10 13:09) [23]

А если в таблице ещё ничего нет?


 
stud ©   (2006-04-10 13:16) [24]

так на нет и суда нет))) ничего и не получим, равносильно отсутствию пропущенных номеров


 
Ega23 ©   (2006-04-10 13:23) [25]

Это я к тому, что IsNull нехило бы добавить...


 
stud ©   (2006-04-10 13:30) [26]

Ega23 ©   (10.04.06 13:23) [25]
Это я к тому, что IsNull нехило бы добавить...

проверил на пустой таблице - ниче не получил. а вообще проверки всякие это кому надо, так сказать. сама идея не очень хорошая, так чего напрягаться?


 
Johnmen ©   (2006-04-11 09:32) [27]

Вот этот пример
SELECT T1.ID+1, MIN(T2.ID)-1, MIN(T2.ID)-T1.ID-1
FROM TABLE T1
JOIN TABLE T2 ON T1.ID<T2.ID
GROUP BY T1.ID
HAVING MIN(T2.ID)-T1.ID>1

Получаем промежутки пропущенных ID.
В первой колонке будет начальный ID промежутка, во второй конечный.
В третьей количество пропущенных ID в промежутке.



Страницы: 1 вся ветка

Текущий архив: 2006.06.04;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.056 c
2-1148051126
Мурзилка
2006-05-19 19:05
2006.06.04
нажатый shift


2-1147540891
serko
2006-05-13 21:21
2006.06.04
Запуск скрипта!


2-1148054439
Мурзилка
2006-05-19 20:00
2006.06.04
кодировки


2-1147686560
Cherman
2006-05-15 13:49
2006.06.04
OpenDialog


15-1147251017
boriskb
2006-05-10 12:50
2006.06.04
Не пойму - это смешно или грустно?