помогите плз с лёгким запросом в SQL

kostyahe

пожалуйта!
плз не ругайтесь, я тока первый день изучаю! :)
в общем такая проблема:
есть например, бд такого типа
X Y
1 y1
2 y2
4 y3
6 y4
то есть в первом столбце нумеровка отличная от натурального ряда. надо вывести минимальное не занятое число. в данном случае это будет 3.
то есть так-то понятно как всё это делать. но как такую операцию включить в запрос? я теряюсь, все остальные задания дались очень легко, на этом зависла :(
мне хотя б совет просто

stat7984215


select min(X + 1)
from your_table
where X + 1 not in (select X from your_table)

mbolik1

Не пройдёт если ряд начинается с двойки.
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

Boris1980

А какие требования в скорости работы?
Сижу и думаю, что будет если в таблице миллионов 20 записей...

kostyahe

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

stat7984215

Согласен. Невнимательно прочитал условие :o

stat7984215

Сижу и думаю, что будет если в таблице миллионов 20 записей...
Ну, это от задачи зависит. Можно, например, кешировать все пропущенные номера в отдельной таблице.

Boris1980

Как идея: использовать столбец RowNum и перемножить таблицу саму на себя.

stat7984215

Ну, этот самый RowNum тоже вычислять нужно будет, и я сомневаюсь, что это можно сделать быстро, не прибегая с СУБД-специфичным расширениям.

mbolik1

А какие требования в скорости работы?
Сижу и думаю, что будет если в таблице миллионов 20 записей...
Тогда нужно смотреть откуда вообще взялась такая задача. Редко кому нужно искать первое пропущенное число из 20 миллионов.
Кстати параллельные вычисления помогут.

mbolik1

Как идея: использовать столбец RowNum и перемножить таблицу саму на себя.
Тогда уж использовать аналитические запросы.

Papazyan

В нормальной БД, если таблица отсортирована:

exec min n-1 from tbl where n<>i+1

Papazyan


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

sinet

В нормальной БД это делается ничуть не медленнее: :p
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;

saveliev_a

Есть предположение, что автору вопроса это возможность нужна потому, что он не слышал о первичных ключах и автоувеличении.

kruzer25

Есть предположение, что автору вопроса это возможность нужна потому, что он не слышал о первичных ключах и автоувеличении.
И ещё - потому что автор вопроса и не подозревает о том, что, даже если он не будет экономить на ключах, втыкая записи на свободные места - свободные числа всё равно при его жизни не кончатся.

evgarus

А может это просто задачка с какого-нибудь sql-ex.ru и для реальной жизни она на самом деле нах не нужна? Топикстартер вроде же писал что это он типа задачки какие-то решает.

kruzer25

Задачка с hirurg-ex.ru:
А теперь попробуйте удалить гланды. Но учтите, мы же тут не реальную неинтересную жизнь показываем, а даём вам интересные задачи, которые заставят напрячься ваш мозг и руки - так вот, гланды вы будете удалять через анальное отверстие.
Ну что же, поехали!

kostyahe

на самом деле я всё уже разобралась давным давно конечно доп. требований не было, просто училась писать запросы, такие, что могут понадобиться при реальной работе с БД, ну типа поиск по слову, сделать определённую выборку и тп.. мне даже уметь создавать базы пока не надо, как пригодится научусь - пока хватает запросов В)
тему не закрывала, чтоб любители пофилософствовать могли тут пофлудить :р а в целом с моей стороны больше вопросов нет, всем огромное спасибо ещё раз! selectы писать научилась, на довольно приличном уровне!
Оставить комментарий
Имя или ник:
Комментарий: