【问题标题】:Is order by clause allowed in a subquery子查询中是否允许 order by 子句
【发布时间】:2010-01-20 14:15:06
【问题描述】:

有什么理由为什么或为什么不应该在子查询中执行“order by”?

【问题讨论】:

    标签: sql subquery sql-order-by


    【解决方案1】:

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

    子查询将用于某些外部查询(否则将毫无意义),并且该外部查询无论如何都必须进行排序,因此对子查询进行排序没有意义。

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

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

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

    【讨论】:

      【解决方案2】:

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

      SQL Server 不允许它,除非子查询也包含 TOPFOR 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
      

      【讨论】:

        【解决方案3】:

        除非您使用 top 它没有用,因为无论如何您都将在外部查询中进行排序

        【讨论】:

          【解决方案4】:

          更聪明的人说这不是正确/有效的方法。 就我而言,SELECT TOP 100 PERCENT in sub-query 解决了这个问题。

          干杯

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              【解决方案6】:

              根据子查询的大小,它会在不同程度上影响性能。

              顺序在子查询中并不重要。您应该能够将 Order By 部分移至外部查询(应该是返回最终结果的部分)。

              【讨论】:

                【解决方案7】:

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

                【讨论】:

                  【解决方案8】:

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

                  【讨论】:

                    【解决方案9】:

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

                    【讨论】:

                    • 通常?你能给出结果会不同的任何情况吗?
                    • 如果在子选择中添加 LIMIT 语句会有所不同。在这种情况下,如果您想按姓名查看前 5 位作者的所有条目,您可以将子选择更改为 (SELECT id FROM authors ORDER BY name DESC LIMIT 5)。
                    • 是的。使用 TOP/LIMIT 它会有所作为(并且是必要的,有时甚至是必需的)。否则,它没有任何区别。
                    • 请注意MySQL 不支持ORDER BY ... LIMITIN 子查询中。
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-06-05
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多