CREATE TABLE t (i int);
INSERT INTO t VALUES (1), (2), (3), (5), (8), (10), (13), (19);
Вывести минимальное натуральное число, которого нет в таблице t, т.е. 4.
Т.е., есть таблица с полем целого типа, надо найти наименьшее натуральное число, которое не присутствует в таблице, одним запросом. Задача из реальной жизни, например, нужно вместо генерации нового индекса попробовать использовать один из неиспользующихся.
Чем менее экзотические средства будут применены - тем лучше.Варианты решения постим в комменты.
SELECT IF((SELECT MIN(i) FROM t)>1,1,MIN(i+1)) FROM t WHERE i+1 NOT IN (SELECT i FROM t);
ОтветитьУдалитьВот такое решение у меня, кто лучше?!
ОтветитьУдалитьSELECT MIN(a.i+1) FROM t AS a LEFT JOIN t as b ON a.i+1 = b.i WHERE b.i is null;
SELECT MAX(t2.i)+1 FROM t AS t1 LEFT JOIN t AS t2 ON (t1.i+1=t2.i) ORDER BY t2.i ASC
ОтветитьУдалитьSELECT (`i`+1) as y FROM `t` WHERE (`i`+1) NOT IN (SELECT `i` from `t` WHERE 1) LIMIT 1;
ОтветитьУдалитьНе учитывает '1' если она является минимальным отсутствующим числом.
Юрий, твой запрос неверный. поставь для эксперимента первой строкой в таблице 100.
ОтветитьУдалитьА на счет единицы, только у мну единственно верный запрос ;) 1 (наименьшее натуральное), если она не входит в таблицу, вы все проигнорили
Да, неверный, спасибо.
ОтветитьУдалитьВнес уточнение в запрос.
SELECT (`i`+1) as y FROM `t` WHERE (`i`+1) NOT IN (SELECT `i` from `t` WHERE 1) order by `i` LIMIT 1;
А на счет единицы, у вас тоже в первом варианте она игнорировалась ;) Я его увидел после попытки добавления своего варианта. При наличии времени подправлю свой с учетом 1.
Поведайте мне, убогой, какие практические знания и навыки можно протестировать решением такой задачи, что она "вполне годится на собеседования выставлять"?
ОтветитьУдалитьКак уебать базу одним запросом?
Ув.Елена, если НЕ пытаться даже решать какие-либо нестандартные задачи, то практических знаний добиться решением такой задачи по SQL НЕ удастся. Из навыков можно проверить во-первых смекалку, во-вторых общий уровень знаний БД на примере реальной задачи.
ОтветитьУдалитьК примеру, вам нужно назначить встречу на какую-то дату, как можно раньше из свободных дней. - Вот вам уже реальной применение.
Насчёт грохнуть базу одним запросом, это по-моему даже у первокурсника не составит труда. Так что ваш юмор неуместен.
Если дополнить решение webaurum от 21 октября 2009 г. 9:35, чтобы обрабатывалась 1, то будет правильно
ОтветитьУдалитьSELECT IF((SELECT MIN(i) FROM t)>1,1,(SELECT MIN(a.i+1) FROM t AS a LEFT JOIN t as b ON a.i+1 = b.i WHERE b.i is null)) AS min_value
Для MySQL:
ОтветитьУдалитьSELECT min(rn) FROM (SELECT t.i, @n:=@n+1 AS rn, t.i - @n AS gr FROM t, (SELECT @n:=0) y ORDER BY i) x
WHERE gr > 0;
Для Oracle:
1)
select min(rn)
from (select t.i, row_number() over(order by i) rn from t) t
where i - rn > 0;
2)
select rn
from (select t.*, row_number() over(order by i) rn from t) x
where id - rn > 0
and rownum = 1