Выборка докладчика, если известно только имя предыдущего

Рейтинг: 0Ответов: 2Опубликовано: 03.04.2015

В компании решили устроить обмен опытом между сотрудниками. Для этого каждый день один из сотрудников делает доклад. Сотрудники выступают в алфавитном порядке. После того как все сотрудники сделали доклад докладчиком становится первый сотрудник. Создайте запрос который возвращает имя докладчика, если известно имя предыдущего докладчика.

Собственно пусть таблица Emp будет состоять только из поля ename - имя сотрудника. Это не столь важно. Я подумал, что можно склеять её два раза и вывести вместе с rownum.

SELECT ename, rownum 
FROM(
  SELECT ename, rownum 
  FROM(SELECT ename FROM Emp ORDER BY ename) 
  UNION ALL 
  SELECT ename, rownum 
  FROM (SELECT ename FROM Emp ORDER BY ename)
);

Дальше мне кажется логичным запросить у пользователя имя, найти первое вхождение этого имени в таблице, взять его rownum, увеличить на 1 и выбрать из таблицы нужное имя. Но как это добавить в этот запрос я уже запутался.

Ответы

▲ 3Принят

Для того чтобы найти следующего спикера можно отсортировать полный список и потом взять из него запись, как это предложил @msi но есть гораздо более экономный вариант который будет использовать индекс по полю ename :

select 
  nvl(
   (select min(ename) from emp where ename > :input_name),
   (select min(ename) from emp )
  ) another_next_for_last
from dual;  

С помощью индекса определяется следующий и, в случае если его нет - первый по тому же индексу.

Сравнить варианты можно в этом SQLFiddle.

▲ 1
select * from tablename
where upper(name) < upper(knownName)
order by upper(name) desc
limit 1;