помогите плз с лёгким запросом в SQL
select min(X + 1)
from your_table
where X + 1 not in (select X from your_table)
select min(a) from
(
select X+1 as a from your_table where X+1 not in (select X from yor_table)
union all
select 1 from your_table where 1 not in (select X from yor_table)
) t
Сижу и думаю, что будет если в таблице миллионов 20 записей...



а вообще я дурак. больше постараюсь по таким пустякам не спрашивать)

Сижу и думаю, что будет если в таблице миллионов 20 записей...Ну, это от задачи зависит. Можно, например, кешировать все пропущенные номера в отдельной таблице.
Как идея: использовать столбец RowNum и перемножить таблицу саму на себя.
Ну, этот самый RowNum тоже вычислять нужно будет, и я сомневаюсь, что это можно сделать быстро, не прибегая с СУБД-специфичным расширениям.
А какие требования в скорости работы?Тогда нужно смотреть откуда вообще взялась такая задача. Редко кому нужно искать первое пропущенное число из 20 миллионов.
Сижу и думаю, что будет если в таблице миллионов 20 записей...
Кстати параллельные вычисления помогут.
Как идея: использовать столбец RowNum и перемножить таблицу саму на себя.Тогда уж использовать аналитические запросы.
exec min n-1 from tbl where n<>i+1
m:(1+til 20000500) except -500?20000500 / 20 mil unique numbers
tbl: asc ([]n:m;s:20000000#`a) / sample table, 20 mil rows, 2 cols
\t exec min n-1 from tbl where n<>i+1 / speed - 720 milsecs

create table test (data, primary key (data organization index as select level from dual connect by level < 20000500;
delete from test where data in (select round(dbms_random.value(1,20000500 from dual connect by level < 500);
select * from (select rownum rn from (select data from test order by data) where data <> rownum) where rownum = 1;
Есть предположение, что автору вопроса это возможность нужна потому, что он не слышал о первичных ключах и автоувеличении.
Есть предположение, что автору вопроса это возможность нужна потому, что он не слышал о первичных ключах и автоувеличении.И ещё - потому что автор вопроса и не подозревает о том, что, даже если он не будет экономить на ключах, втыкая записи на свободные места - свободные числа всё равно при его жизни не кончатся.
А может это просто задачка с какого-нибудь sql-ex.ru и для реальной жизни она на самом деле нах не нужна? Топикстартер вроде же писал что это он типа задачки какие-то решает.
А теперь попробуйте удалить гланды. Но учтите, мы же тут не реальную неинтересную жизнь показываем, а даём вам интересные задачи, которые заставят напрячься ваш мозг и руки - так вот, гланды вы будете удалять через анальное отверстие.
Ну что же, поехали!
тему не закрывала, чтоб любители пофилософствовать могли тут пофлудить :р а в целом с моей стороны больше вопросов нет, всем огромное спасибо ещё раз! selectы писать научилась, на довольно приличном уровне!
Оставить комментарий
kostyahe
пожалуйта!плз не ругайтесь, я тока первый день изучаю!
в общем такая проблема:
есть например, бд такого типа
X Y
1 y1
2 y2
4 y3
6 y4
то есть в первом столбце нумеровка отличная от натурального ряда. надо вывести минимальное не занятое число. в данном случае это будет 3.
то есть так-то понятно как всё это делать. но как такую операцию включить в запрос? я теряюсь, все остальные задания дались очень легко, на этом зависла
мне хотя б совет просто