SQL-запрос со специализированным упорядочением результатов - PullRequest
0 голосов
/ 02 августа 2010

У меня есть таблица с 3 столбцами, представляющими остановки на автобусном маршруте.

ID
stop_name
stop_order

Я хочу вернуть список остановок, начиная с текущей остановки (которую я знаю).Таким образом, если текущая остановка - остановка № 5, то, что возвращается, будет выглядеть следующим образом:

stop_order
5
6
7
8
1
2
3
4

Я попытался:

Select * from routes where stop_order >= 3 and route = 'Red' 
Union 
Select * from routes where stop_order < 3 and route = 'Red

, и это работает, если данные были введены в таблицув порядке остановок.Если это не так, он возвращает данные в порядке их ввода.

Ответы [ 5 ]

6 голосов
/ 02 августа 2010

Вы можете сделать это в одном запросе, чтобы сэкономить на доступе к таблице, используя операторы case.

select * from routes
where route = 'Red'
order by case when stop_order >= 3 then 0 else 1 end, stop_order
;

Исправлено!

0 голосов
/ 30 июня 2012

ответ правильный на заданный вопрос. Однако я хочу дополнительно оптимизировать код, а также сделать возможным использование DISTINCT в запросе, что невозможно при данном решении.

Посмотрев немного больше, я обнаружил, что вы можете переместить оператор CASE WHEN в select вместо того, чтобы в порядке, указанном ниже:

select distinct route, case when stop_order >= 3 then 0 else 1 end as sorted_by from routes
where route = 'Red'
order by sorted_by, stop_order
;

Надеюсь, что это поможет нескольким людям, имеющим проблемы с заказом, а также использовать DISTINCT.

0 голосов
/ 02 августа 2010

Я думаю, у Патрика это почти что было:

0 голосов
/ 02 августа 2010

Попробуйте упорядочить по stop_order для обоих операторов SQL. По умолчанию порядок сортирует результаты в порядке возрастания

0 голосов
/ 02 августа 2010

Использование этого будет работать:

(Select * from routes where stop_order >= 3 and route = 'Red' Order By ID)
Union 
(Select * from routes where stop_order < 3 and route = 'Red' Order By ID)

Редактировать : добавлены забытые скобки.

...