繁体   English   中英

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

[英]Is order by clause allowed in a subquery

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

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

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

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

它当然可以在某些特定的RDBMS中产生差异,因为它的实现,但这将是特定于实现的,而不是你应该依赖的东西。

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

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

除非子查询包含TOPFOR XML子句,否则SQL Server将不允许它:

-- 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

除非你使用top,否则它无用,因为无论如何你都会在外部查询中进行排序

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

干杯

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

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

有些用法请参见“ 中间实现 ”。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM