Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сделать выборку пропущенных номеров из БД на SQL [D5]


Radix ©   (2006-01-26 08:36:00) 

В общем имеется таблица, где в одном из полей (num) хранится последовательность чисел (неких номеров) 1,2,3,4,6,7,10,11,... Среди них могут быть пропущенные (как в примере). Можно ли на sql (Firebird) сделать выборку пропущенных номеров (по примеру - 5,8,9...) ???


Johnmen   (2006-01-26 10:52: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 в промежутке.


Digitman   (2006-01-26 10:32:00) [2]

create procedure MissingNumbers
returns (ANumber INTEGER)
AS
declare variable TempNumber INTEGER;
begin
 ANumber = 0;
 for
  select NumField
  from SomeTable
  order by NumField
  into :TempNumber
 do begin
   ANumber = ANumber + 1;
   while (ANumber < TempNumber) do
    begin
     suspend;
     ANumber = ANumber + 1;
    end;
 end;  
end;

..

SELECT * FROM MissingNumbers


Radix   (2006-01-26 08:44:00) [3]

Спасибо ЮЮ! Сейчас попробую!


ЮЮ   (2006-01-26 08:42:00) [4]

Если устроит 5, 8 (без 9), то

SELET t0.ID + 1 FROM
 table t0
 LEFT JOIN t1 ON (t0.ID + 1) = t1.Id
WHERE t1.ID IS NULL


Наверх

Титульная страница Поиск, карта сайта Написать письмо