![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Найти дырки в таблице [D6]
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 массив байт, но может быть и строк и записей и т.п.