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

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

Найти дырки в таблице [D6]


Страницы:   1 2

Drakosha ©   (2005-09-06 18:19:00) 

Имеется таблица с уникальным полем, значения в нём должны быть
от 1 до 100.
пример
2
3
4
89
90
Необходимо получить отсутствующие номера (т.е. 1,5,6,...88,91..100)
Можно ли это сделать не привлекая дополнительную таблицу со всеми значениями от 1 до 100?


Zacho   (2005-09-07 11:41:00) [21]

Val ©   (07.09.05 10:40) [6]

Да, ты прав. Если "дырки" идут подряд, то такой запрос покажет только первую в диапазоне.
Сожалею, был не внимателен.
Так что для нахождения всех дырок мой запрос не подходит. А вот для нахождения первой или последней - вполне, правда автору вопроса нужно не это :)

2 Drakosha ©  : укажи СУБД, возможно что для твоей СУБД существует решение именно одним запросом.


Anatoly Podgoretsky   (2005-09-07 11:28:00) [22]

Почему 5, а не 1


Val   (2005-09-07 10:40:00) [23]

>[5] Zacho ©   (07.09.05 08:37)
в данном примере, он не покажет номера с 5 по 88, а только 5-й. т.е. он находит "первый пустой" за текущим id.


Zacho   (2005-09-07 08:37:00) [24]

Да можно и одним запросом:

SELECT T1.ID+1
FROM MY_TABLE T1
LEFT JOIN MY_TABLE T2
 ON T1.ID+1=T2.ID
WHERE T2.ID IS NULL


По крайней мере на IB/FB такой запрос работает, на других СУБД - не знаю :)


Desdechado   (2005-09-06 21:06:00) [25]

хм, отвлекся, не запостив, и на тебе - опередили


Desdechado   (2005-09-06 20:26:00) [26]

ХП написать :)


Lexer   (2005-09-06 19:57:00) [27]

Как вариант, - можно написать простенькую процедурку:
create procedure get_dyrki
returns (order_number smallint)
begin
 last_order_number = 0;
 while order_number < 100 do
 begin
   order_number = order_number + 1;
   if (not(exists(select order_number from table_1 where order_number = :order_number))) then suspend;
  end
end


Shopot   (2005-09-06 18:42:00) [28]

Можно!


var
 Numbers: array [1..100] of Byte;
 IsEntry: array [1..100] of Boolean;

procedure InitArrays;
var
 i: Integer;
begin
 for i := 1 to 100 do
 begin
   Numbers [i] := i;
   IsEntry [i] := False;
 end;
end;

procedure LookIntoTable;
var
 i, RecordCount: Integer;
begin
 RecordCount := Table.RecordCount;

 if RecordCount > 100 Exit;

 for i := 0 to RecordCount - 1 do
 begin
   if Table['_ID'] = Numbers [i] then
     IsEntry [i] := True
   else
     IsEntry [i] := False;
 end;
end;


Таким образом знаем какие числа входят и каких нет.
Наример:


 ...
 if IsEntry [10] then
   ShowMessage ('Number = ' + IntToStr (Number [10]) + ' exists!');
 ...


Кроме того Numbers массив байт, но может быть и строк и записей и т.п.


Страницы:   1 2

Наверх

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