2010-01-22 8 views
2

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

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

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

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

ID 
--- 
3 
4 
6 
7 
8 
9 
10 

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

ответ

5
SELECT num 
FROM (
     SELECT level AS num 
     FROM dual 
     CONNECT BY 
       level <= 10 
     ) 
WHERE num NOT IN 
     (
     SELECT id 
     FROM mytable 
     ) 

Первый вложенный запрос является рекурсивным запросом по однорядной pseudotable, dual.

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

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

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

@ Abdullah Dogan предоставил другой способ сделать это с помощью оператора MINUS. Это делает то же самое, но более разборчиво.

+0

это выглядит лучше, во всяком случае, так я пошел вперед и удалил свой собственный пост. +1 –

+0

Отлично! Не могли бы вы объяснить немного больше кода? – Khelben

6

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

select level lvl from dual connect by level<=10 
minus 
select id from table; 
+0

+1 для использования 'MINUS' – Quassnoi

Смежные вопросы