2012-05-02 3 views
0

У меня довольно сложный запрос, который отлично работает в Access и MySQL, но не работает в MS SQL. Получите сообщение «Неверный синтаксис рядом с ключевым словом« ORDER ». Цель запроса - получить 100 лучших заказов с ускоренной доставкой (USPS Express).Почему этот подзапрос не выполняется?

SELECT * 
FROM ( SELECT 
      TOP 100  o.orderid 
        , ( 
          select 1 
          from orders 
          where orderid = o.orderid 
          and  oshipmethod = 'USPS Express' 
         ) as ship_priority 
      FROM orders o 
      WHERE o.order_status = 10 
     ) 
ORDER BY ship_priority DESC 

Понятная причина, по которой этот запрос не удается?

+1

Внутренний TOP не имеет соответствующее предложение ORDER BY. Точно, какие TOP 100 строк вы ожидаете? –

+0

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

+0

Хороший улов Аррон, я переместил TOP 100 на внешний выбор, где он принадлежит – rhall

ответ

3

Вы должны предоставить псевдоним выходному выходному/выходному запросу вывода. В противном случае вы столкнетесь с ошибкой.

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

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

SELECT * 
FROM ( SELECT 
      TOP 100  o.orderid 
        , ( 
          select 1 
          from orders 
          where orderid = o.orderid 
          and  oshipmethod = 'USPS Express' 
         ) as ship_priority 
      FROM orders o 
      WHERE o.order_status = 10 
     ) T1 
ORDER BY ship_priority DESC 
+0

Отлично, добавив производное название таблицы, отлично работало, спасибо! – rhall

1

Вы упускаете псевдоним внешней производной таблицы:

Изменить это:

 WHERE o.order_status = 10 
    ) 
ORDER BY ship_priority DESC 

В это:

 WHERE o.order_status = 10 
    ) as derivedTable 
ORDER BY ship_priority DESC