2012-05-02 239 views
0

我有一個相當複雜的查詢工作在訪問和MySQL罰款,但沒有在MS SQL工作。收到一條消息,「這個關鍵字‘ORDER’附近有語法錯誤」。查詢的目的是讓高層100份訂單,​​以加快航運(「USPS快報」)第一。爲什麼這個子查詢失敗?

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

內頂不具有對應的ORDER BY子句。究竟哪個TOP 100排你期望? –

+0

我不確定爲什麼人們認爲他們使用的SQL Server版本應該是這樣一個保守的祕密。它通常是解決方案的關鍵部分。 –

+0

很好的捕獲阿龍,我把前100名移到了它所屬的外圍選擇 – rhall

回答

3

你必須提供一個別名派生表輸出/子查詢輸出。否則,您將遇到錯誤。

話雖如此,我認爲,這個查詢可以在一個更好的方式來寫。

正確版本:注意ORDER BY子句之前T1。我給了一個簡單的名字,但是你可以將它命名,但是你想要。而不是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