2013-07-22 2 views
3

This question объясняет, как найти первый «неиспользуемый» номер в таблице, но как я могу найти то же самое, чтобы определить дополнительные ограничения. Как изменить запрос, чтобы получить первое неиспользованное число после того, как оно больше 100Как найти пробел в диапазоне в SQL

например. Если у меня есть 23, 56, 100, 101, 103 в моей таблице я должен получить 102.

+0

Включить в 'где мо. id> 100' условие (в любом из запросов в принятом ответ). –

+0

'где id> 100' – Filip

+0

какая СУБД вы используете? Postgres? Oracle? –

ответ

6

в MySQL и PostgreSQL

SELECT id + 1 
FROM test mo 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM test mi 
     WHERE mi.id = mo.id + 1 
     ) and mo.id> 100 
ORDER BY 
     id 
LIMIT 1 

fiddle for mysql и fiddle for postgresql

в MS SQL

SELECT TOP 1 
     id + 1 
FROM test mo 
WHERE NOT EXISTS 
     (
     SELECT NULL 
     FROM test mi 
     WHERE mi.id = mo.id + 1 
     ) 
      and mo.id > 100 
ORDER BY 
     id 

fiddle

3

В Oracle Sql вы можете попробовать:

SELECT id 
FROM 
    (SELECT ID, lead(ID) OVER(ORDER BY ID) next_val FROM my_table t 
    ) 
WHERE id +1 <> next_val 
AND id  >100; 
+0

На самом деле это не Oracle. Он использует стандартную функцию окна ANSI SQL, которая также будет работать в Postgres, SQL Server 2012, DB2 и многих других современных СУБД. –

+0

благодарит за информацию. Я этого не знал. – ajmalmhd04

1

надеюсь, что это поможет вам

SELECT MIN (id) + 1 
    FROM myTable T1 
WHERE id >= 100 
    AND NOT EXISTS (SELECT * 
        FROM myTable T2 
        WHERE T1.id + 1 = T2.id) 
+0

Работает неплохо, за исключением случаев, когда id 101 свободен, а 1000 - первым, я получу 1001 для какой-то странной причины .... – Kimvais

+0

В этом случае вы должны заменить «id> 100» на «id> = 100» как показано в запросе – agarici

0

Использование generate_series() для развлечения & прибыли:

CREATE table islands (num INTEGER NOT NULL PRIMARY KEY); 

INSERT INTO islands (num) VALUES 
(23), (56), (100), (101), (103) ; 

WITH total AS (
     SELECT generate_series(mima.bot, mima.top) AS num 
     FROM (SELECT MIN(num) AS bot , MAX(num) AS top FROM islands) mima 
     ) 
SELECT num 
FROM total tt 
WHERE num >=100 
AND NOT EXISTS (
     SELECT * 
     FROM islands ii 
     WHERE ii.num = tt.num 
     ) 
     ; 
0

использовать это:

SELECT TOP 1 a1.id + 1 FROM test a1 left JOIN test a2 
ON a1.id = a2.id - 1 
WHERE a2.id IS NULL AND a1.id > 100 
Смежные вопросы