2008-10-29 7 views
0

Oracle дает мне ошибку (ORA-00907: недостающую правую скобку), когда я запускаю этот запрос:Описывает ли Oracle ORDER BY внутри предложения IN?

select * 
from reason_for_appointment 
where reason_for_appointment_id in 
(
    select reason_for_appointment_id 
    from appointment_reason 
    where appointment_id = 11 
    order by appointment_reason_id 
) 

Однако, когда я запускаю только подзапрос, нет никакой ошибки.

Может ли кто-нибудь объяснить, в чем проблема?

+0

Что вы думаете по этому поводу? Заказ должен быть ненужной операцией, потому что индексирование Оракула будет делать это за кулисами. – 2008-10-29 20:00:21

+0

Что? Сделайте что за кулисами? И почему это будет делать с индексом? – 2008-10-30 15:34:53

ответ

3

Проблема в том, что ORDER BY не разрешен внутри подзапроса, подобного этому. Зачем вы его хотели?

+0

Я предполагаю, что он хочет, чтобы результат был заказан по полю ID. См. Мой ответ, как это сделать. – 2009-01-20 16:16:58

11

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

1

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

select reason_for_appointment.* 
from reason_for_appointment rfa, appointment_reason ar 
where rfa.reason_for_appointment_id = ar.reason_for_appointment_id 
and ar.appointment_id = 11 
order by ar.appointment_reason_id; 
0

выберите * из reason_for_appointment где reason_for_appointment_id в (выбрать reason_for_appointment_id из appointment_reason где appointment_id = 11 заказа по appointment_reason_id)

попробовать что-то вроде: с ДОПОЛНИТЕЛЬНЫМ как (выберите reason_for_appointment_id из appointment_reason где appointment_id = 11 Сортировать по destination_reason_id) выберите reason_for_appointment_id из встречи_reason, где reason_for_appointment_id в (выберите reason_for_appointment_id из auxiliar)

0

Если ваша цель состоит в том, что выход заказали, вы просто хотите переместить ORDER BY снаружи подзапроса:

select * from reason_for_appointment where reason_for_appointment_id in 
(select reason_for_appointment_id from appointment_reason where appointment_id = 11) 
order by reason_for_appointment_id 

(я предполагаю, что там, где вы писали «appointment_reason_id» Вы имели в виду «reason_for_appointment_id». Если на самом деле есть две разные колонки с этими именами ... ouch.)