是否在子查询中允许order by子句

时间:2010-01-20 14:15:07

标签: sql subquery sql-order-by

有什么理由为什么或者为什么不在子查询中执行'order by'?

9 个答案:

答案 0 :(得分:12)

是的:不应该这样做,因为它在概念上没有意义。

子查询将在一些外部查询中使用(否则它将毫无意义),并且外部查询无论如何都必须进行排序,因此没有必要对子查询进行排序。

这是因为SQL中的查询结果没有特定的顺序,除非您使用显式的ORDER。因此,即使您在子查询中使用了ORDER,也无法保证这会影响外部查询的结果顺序;所以这毫无意义。

由于它的实现,它当然可能会对某些特定的RDBMS产生影响,但这将是特定于实现的,而不是你应该依赖的东西。

编辑:当然,如果在子查询中使用TOP或LIMIT,需要使用ORDER。但是那不是标准的SQL ......

答案 1 :(得分:11)

如果子查询使用某种LIMIT / TOP,则应使用它。

除非子查询包含SQL ServerTOP子句,否则

FOR XML将不允许它:

-- Fails
WITH    q(id) AS
        (
        SELECT  1
        UNION ALL
        SELECT  2
        )
SELECT  *
FROM    (
        SELECT  *
        FROM    q
        ORDER BY
                id DESC
        ) q2

-- Succeeds
WITH    q(id) AS
        (
        SELECT  1
        UNION ALL
        SELECT  2
        )
SELECT  *
FROM    (
        SELECT  TOP 1 *
        FROM    q
        ORDER BY
                id DESC
        ) q2

-- Succeeds, but ORDER BY is ignored
WITH    q(id) AS
        (
        SELECT  1
        UNION ALL
        SELECT  2
        )
SELECT  *
FROM    (
        SELECT  TOP 100 PERCENT *
        FROM    q
        ORDER BY
                id DESC
        ) q2

答案 2 :(得分:3)

除非你使用top,否则它没用,因为无论如何你都会在外部查询中订购

答案 3 :(得分:2)

聪明的人说这不是正确/有效的方式。 在我的情况下,子查询中的SELECT TOP 100 PERCENT解决了这个问题。

干杯

答案 4 :(得分:1)

你可以这样做,但除非你有需要,否则我通常不会这样做。

优化器会忽略它(或抛出错误?)

有些用法请参阅“Intermediate materialisation”。

答案 5 :(得分:1)

根据子查询的大小,它会影响性能到变化程度。

但是,对于子查询,顺序无关紧要。您应该能够将Order By部分移动到Outer Query(应该是返回最终结果的那个)。

答案 6 :(得分:1)

当您对整个数据的子集感兴趣时,ORDER BY在子查询中无效,因此您始终需要TOP(SQL Server)。在子查询中没有TOP的ORDER BY是没有意义的,因为结果的整体排序由外部查询处理。

答案 7 :(得分:1)

你不应该使用它。根据'Art of SQL',这实际上阻止了优化器执行它本来可以执行的各种优化,因为这会过早地转换数据。

答案 8 :(得分:-3)

这是完全合法的。即SELECT id FROM entries WHERE author_id IN (SELECT id FROM authors ORDER BY name DESC)但你通常会得到相同的结果。