Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.06.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.041 c
2-1146931088
Mr tray
2006-05-06 19:58
2006.06.04
Убрать application с таскбара насовсем


1-1145815933
Frostik
2006-04-23 22:12
2006.06.04
Получение вывода DOS-приложения в реальном времени


5-1132748649
DimaBR
2005-11-23 15:24
2006.06.04
Сохранение Published свойства


1-1146036679
leonidus
2006-04-26 11:31
2006.06.04
Как в TListView отобразить больше 32000 записей


15-1147085301
BAngel
2006-05-08 14:48
2006.06.04
Скачать делфи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский