Простой подход
Ингредиенты:
- Генератор стол
- внешнее соединение
SQL Fiddle
MySQL 5.6 Схема установки:
create table t (id int, value int);
insert into t values (1, 12);
insert into t values (3, 12);
insert into t values (7, 12);
insert into t values (9, 12);
Запрос 1:
select generator.row
from t right outer join
(
SELECT @row := @row + 1 as row FROM
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t4,
(SELECT @row:=0) t5
) generator
on generator.row = t.id
where t.id is null and generator.row < (select max(t.id) from t)
Results:
| row |
|-----|
| 2 |
| 4 |
| 5 |
| 6 |
| 8 |
Комплексный подход
Если вам нужны ваши ограничения зазора, вы нужны ингредиенты:
Here your query
MySQL 5.6 Настройка схемы:
create table t (id int, value int);
insert into t values (1, 12);
insert into t values (3, 12);
insert into t values (7, 12);
insert into t values (9, 12);
дие чень:
select generator.row, rFrom, rTo
from (
SELECT @r := @r + 1 as r,
case
when @r < t.id then @r
else Null
end as rFrom,
case
when @r < t.id then t.id - 1
else Null
end as rTo,
@r := t.id
FROM t , (SELECT @r:=0) r
) gaps inner join
(
SELECT @row := @row + 1 as row FROM
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t2,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t3,
(select 0 union all select 1 union all select 3 union all select 4 union all select 5 union all select 6 union all select 6 union all select 7 union all select 8 union all select 9) t4,
(SELECT @row:=0) t5
) generator
on generator.row between gaps.rFrom and gaps.rTo
where rFrom is not null
Results:
| row | rFrom | rTo |
|-----|-------|-----|
| 2 | 2 | 2 |
| 4 | 4 | 6 |
| 5 | 4 | 6 |
| 6 | 4 | 6 |
| 8 | 8 | 8 |
Первый подзапрос ищет пробелы интервалов, второй один генератор для выработки недостающих идентификаторов. Будьте готовы выполнять оба запроса один за другим, чтобы понять это.
Зачем вам это нужно? – Jens
@Jens Мне нужно каждый день проверять отсутствующие данные, и я должен их найти и сохранить в db. – Bora
Одна вещь, которую я могу предложить, - это сгенерировать последовательность и выполнить внешнее соединение с вашей таблицей. Недопустимые значения будут иметь * null *, который указывает ваш недостающий ID. –