среда, 30 марта 2011 г.

Как в SQL получить то, чего в базе нет


Я не назвал бы себя знатоком SQL. Я просто знаю как мне выбирать, вставлять и изменять нужные мне данные. Поэтому решить мне такую задачку просто с ходу не хватило знаний. Хотя она не такая и сложная.

Предыстория: регистрировал 1000 пользователей через http-запросы к системе. Получил отказы в 70% случаев. Регистрировал по маске u000
Задача: Выбрать список пользователей не зарегестрированых в системе. Если известен список зарегестрированых пользователей. А список пользователей, которых надо зарегестрировать соответствует определенной с буквенным префиксом и цифровым суффиксом, вырастающим инкрементально с шагом 1.

Получил решения от своих коллег разработчиков :)


Решение №!

select 
 a.id
from 
(select 'u'||rownum id from dual connect by rownum <= 1000) a
where 
 a.id not in (
 select u.user_name from users u
  where u.un like 'u%'
  )
;

Решение №2

select idx, user_name
from 
(select rownum idx from dual connect by rownum <= 1000) seq
left outer join users u on to_char(seq.idx) = substr(un, 2, length(un)-1) and un like 'u%'
where un is null
order by idx;

Комментариев нет:

Отправить комментарий