为什么这个子查询失败了?

时间:2012-05-02 19:14:33

标签: sql-server

我有一个相当复杂的查询,可以在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

此查询失败的任何明显原因?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您缺少外部派生表的别名:

改变这个:

        WHERE   o.order_status = 10 
    ) 
ORDER BY ship_priority DESC

进入这个:

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