![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
?SQL [IB5.x]
PrettyFly © (2002-09-18 17:45:00)Есть такая задача:
Дана таблица с integerами (>0), нужно
найти минимальный integer >0, который
не встречается в этой таблице...
(всё это в InterBase 5)
CREATE PROCEDURE GetMinNumber
RETURNS (MinNumber INTEGER)
AS
BEGIN
MinNumber = 1;
WHILE (MinNumber IN (SELECT Number FROM OurTable))
DO MinNumber = MinNumber + 1;
END
почему такая процедурка выдаёт ошибку
"subselect illegal in this context"
и как тогда лучше сделать?
Johnmen (2002-09-19 15:03:00) [1]Проанализировав идею SVM (19.09.02 08:41),
можно получить сразу то, что надо, так :
SELECT 1 AS Fld FROM Tbl
WHERE 1<(SELECT MIN(id) FROM Tbl)
UNION
SELECT A.id+1 AS Fld FROM Tbl A, Tbl B
WHERE (A.id=B.id+1) AND
(1=(SELECT MIN(id) FROM Tbl))
PrettyFly (2002-09-19 13:33:00) [2]Спасиба за идею...
SVM (2002-09-19 08:41:00) [3]Еще вариант:
1. Найти минимальное значение поля (ID).
Если это значение >1, то искомое значение
на 1 меньше. Иначе выполнить запрос:
2. select a.ID+1 as aID,
b.id as bID from T a Left Join T b
on a.id=b.id-1 where b.ID is null order by 1
Первая строка будет содержать требуемое значение.
ЮЮ (2002-09-19 03:21:00) [4]Может лучше пробежаться по одному запросук таблице, сравнивая Number текущей записи с PriorNumber, запомненым при просмотре предыдущей записи, и если Number-PriorNumber>1 возвращать PriorNumber+1, чем выполнять новый запрос в цикле
Андрей Прокофьев (2002-09-18 17:57:00) [5]Извините, невнимательно прочел и вообще не подумал :(
Андрей Прокофьев (2002-09-18 17:55:00) [6]Может, найти минимальный, который встречаетсяи отнять 1