Как получить список чисел отсутвующих в базе PostgreSQL?

В базе присутствуют такие данные (например):
  1. id: 1 | name: "any_name"
  2. id: 2 | name: "any_name"
  3. id: 4 | name: "any_name"
  4. id: 7 | name: "any_name"
  5. id: 8 | name: "any_name"
  6. id: 11 | name: "any_name"


Как одним запросом получить не вошедшие в вывод - 3,5,6,9,10 - числа отсутствующие в базе?
  • Вопрос задан
  • 398 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Нужен опорный список значений и not exists подзапрос. Опорный список можно сделать через generate_series функцию
select n from generate_series(1,11) as n
where not exists (select from tablename where id = n)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ponaehal
ИМХО, если такой вопрос возник, то ВОЗМОЖНО что -то делаете не так. Вещать бизнес-смысл на IDб основная цель которых обеспечить уникальность - это в общем случае не очень правильно.
Тем не менее...
Возможно есть более красивое решение, но сходу не приходит в голову (для каждой БД оно будет свое).
Общий подход:
1. Создаем таблицу t2 с большим количеством строк и с одним полем num. В цикле заполняем ее значениями от 1 до n.
2. В запросе минусуем исходную таблицу из t2
SELECT t.num FROM t2
EXCEPT
SELECT t.id FROM base_table t
все.

ЗЫ Если таблицу делать лень, а число записей небольшое, то можно воспользоваться
SELECT unnest(array[1, 2, 3, 4)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы