![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить порядковый номер [D7, MSSQL]
veb © (2006-04-08 18:29:00)Здравствуйте.
Подскажите, как получить первый пропущенный номер в списке номеров, если отстутствует то следующий после максимального? (1,2,3,4,8,9 ответ 5) или (1,2,3,4 ответ 5) или (4,5,6,7 ответ 1) . Когда-то видел здесь классический sql-пример, но не запомнил
Johnmen (2006-04-11 09:32:00) [1]Вот этот пример
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 в промежутке.
stud (2006-04-10 13:30:00) [2]Ega23 © (10.04.06 13:23) [25]
Это я к тому, что IsNull нехило бы добавить...
проверил на пустой таблице - ниче не получил. а вообще проверки всякие это кому надо, так сказать. сама идея не очень хорошая, так чего напрягаться?
Ega23 (2006-04-10 13:23:00) [3]Это я к тому, что IsNull нехило бы добавить...
stud (2006-04-10 13:16:00) [4]так на нет и суда нет))) ничего и не получим, равносильно отсутствию пропущенных номеров
Ega23 (2006-04-10 13:09:00) [5]А если в таблице ещё ничего нет?
stud (2006-04-10 13:07:00) [6]ну вот на вскидку примерно, только на кой это действительно нужно?
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)
stone (2006-04-10 09:38:00) [7]Как вариант, повесить на таблицу триггер, который будет писать удаленные ID в отдельную таблицу, а при использовании его повторно, соответственно удалять из этой таблицы.
Ega23 (2006-04-10 09:25:00) [8]Используй GUID и не парь мозги.
veb (2006-04-10 09:06:00) [9]to sniknik
База у меня однопользовательская! Посмотреть ее можно здесь
http://crimeasoft.narod.ru/Download/VideoCat.exe
(такая ненавязчивая реклама, в целях, что может кто-что хорошее подскажет)
Количество записей в таблице "диски" вряд-ли превысит 1000. Поэтому огромное спасибо ЮЮ и всем кто уже не раз подал дельный совет.
sniknik (2006-04-10 08:49:00) [10]и на сколько времени ты расчитываеш для добавления/подсказки одной записи, при каком размере таблици? т.е. тебя не пугает скажем минутная задержка перед "подсказкой пользователю свободного порядкового номера", при миллионе записей в таблице к примеру?
даже если записей будет не пример меньше, все одно надо чтото менять в консерватории. база у тебя однопользовательская? двух одновременно вводящих юзеров не будет гарантировано? пересечений номеров не боишся?
ЮЮ (2006-04-10 02:58:00) [11]Ты же сам ответил в [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
veb (2006-04-09 23:30:00) [12]to Nikolay
это жутко криво!
было очень красиво! смысл такой:
- пересечь таблицу саму с собой по left join и по какому-то условию и выбрать, кажись, несовпадающие номера.
- взять то ли минимум, то ли максимум
Nikolay M. (2006-04-09 22:28:00) [13]Тупое решение: пронумеровать строки в НД запроса SELECT Number FROM table ORDER BY Number любым методом из ФАК-а
http://www.sql.ru/faq/faq_topic.aspx?fid=126
и выбрать минимальный номер №строки такой, что №строки <> Number с двумя проверками его на NOT NULL.
Правильный запрос писать лень.
Serg1981 (2006-04-09 21:49:00) [14]а на http://www.delphikingdom.ru/не пробовал обращаться ?
Serg1981 (2006-04-09 21:47:00) [15]Мой вопрос и сводится к тому, чтобы искать "пробелы" в порядковых номерах, а не добавлять единицу к последнему.
veb (2006-04-09 21:45:00) [16]to Serg1981
Прошу перенести свой вопрос в другую тему!
Господа специалисты в БД, неужели никто не помнит класический пример SELECT запроса, не зависящий от СУБД или адаптированый под MSSQL?
Здесь на форуме два-три месяца назад была такая тема и там предложили штук шесть вариантов. Пожалуйста, помогите еще раз.
Serg1981 (2006-04-09 21:39:00) [17]
> Ты надеешься этот день увидеть?
А если база интенсивно обновляется милионами записей в день ?
veb (2006-04-09 21:18:00) [18]Сразу хочу сказать что номер диска, это вовсе не ID в таблице, поэтому я думаю не стоит вести спор о том закончится ли диапазон Id номеров в этом веке или загнутся реляционные БД.
Господа специалисты в БД, неужели никто не помнит класический пример SELECT запроса, не зависящий от СУБД или адаптированый под MSSQL?
Здесь на форуме два-три месяца назад была такая тема и там предложили штук шесть вариантов. Пожалуйста, помогите еще раз.
Desdechado (2006-04-09 20:06:00) [19]для Оракла можно так, но это (имхо) через задний проход
SELECT rownum FROM Dba_Objects
MINUS
SELECT line_id FROM Alpha
Anatoly Podgoretsky (2006-04-09 20:03:00) [20]Serg1981 © (09.04.06 19:41) [6]
И почему ты подумал про Integer?