Получение неиспользуемых уникальных значений в таблице SQL - PullRequest
2 голосов
/ 22 января 2010

У меня есть таблица, в которой есть столбец, описывающий числовой идентификатор, который уникален для всех строк (но это не первичный ключ). Числовой идентификатор ограничен (скажем, для ответа, который может быть от 1 до 10)

 SELECT ID FROM TABLE;
 ID
 ---
 1
 2
 5

Я должен представить пользователю (через пользовательский интерфейс) неиспользуемые значения, чтобы позволить выбрать правильное значение для нового ввода. Я знаю, как сделать это с помощью кода (это веб-приложение Grails), просто получить все идентификаторы из базы данных и создать список с теми, которых нет. Но я хочу знать, есть ли способ сделать это непосредственно в запросе SQL.

Итак, этот запрос должен вернуть

ID
---
3
4
6
7
8
9
10

База данных - это Oracle, но, возможно, есть способ сделать это и для других баз данных.

Ответы [ 2 ]

6 голосов
/ 22 января 2010

это может быть полезно,

select level lvl from dual connect by level<=10
minus
select id from table;
5 голосов
/ 22 января 2010
SELECT  num
FROM    (
        SELECT  level AS num
        FROM    dual
        CONNECT BY
                level <= 10
        )
WHERE   num NOT IN
        (
        SELECT  id
        FROM    mytable
        )

Первый подзапрос - это рекурсивный запрос для однострочной псевдотаблицы, dual.

Рекурсивно выбирает записи, пока значение псевдостолбца level не достигнет 10. level увеличивается с каждой записью.

Это распространенный способ создания наборов записей произвольной длины из ничего в Oracle.

Вторая часть просто выбирает только те значения level (с псевдонимом num, чтобы избежать использования зарезервированного слова), которых еще нет в вашей таблице.

@ Абдулла Доган предоставил другой способ сделать это, используя оператор MINUS. Это то же самое, но более разборчиво.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...