【发布时间】:2010-01-20 14:15:06
【问题描述】:
有什么理由为什么或为什么不应该在子查询中执行“order by”?
【问题讨论】:
标签: sql subquery sql-order-by
有什么理由为什么或为什么不应该在子查询中执行“order by”?
【问题讨论】:
标签: sql subquery sql-order-by
是的:不应该这样做,因为它在概念上没有意义。
子查询将用于某些外部查询(否则将毫无意义),并且该外部查询无论如何都必须进行排序,因此对子查询进行排序没有意义。
这是因为 SQL 中的查询结果不会按特定顺序出现,除非您使用显式 ORDER。因此,即使您在子查询中使用了 ORDER,也不能保证这会影响外部查询结果的顺序;所以没有意义。
当然,由于它的实现,它可能会对某些特定的 RDBMS 产生影响,但这将是特定于实现的,而不是您应该依赖的东西。
编辑:当然,如果您在子查询中使用 TOP 或 LIMIT,您将需要使用 ORDER。但这无论如何都不是标准的 SQL...
【讨论】:
如果子查询使用某种LIMIT / TOP,您应该使用它。
SQL Server 不允许它,除非子查询也包含 TOP 或 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
【讨论】:
除非您使用 top 它没有用,因为无论如何您都将在外部查询中进行排序
【讨论】:
更聪明的人说这不是正确/有效的方法。 就我而言,SELECT TOP 100 PERCENT in sub-query 解决了这个问题。
干杯
【讨论】:
【讨论】:
根据子查询的大小,它会在不同程度上影响性能。
顺序在子查询中并不重要。您应该能够将 Order By 部分移至外部查询(应该是返回最终结果的部分)。
【讨论】:
当您对整体数据的子集感兴趣时,子查询中的 ORDER BY 无效,因此您始终需要 TOP (SQL Server)。在子查询中没有 TOP 的 ORDER BY 毫无意义,因为结果的整体排序由外部查询处理。
【讨论】:
你不应该使用它。根据“SQL 的艺术”,这实际上阻止了优化器执行它本来可以执行的各种优化,因为这过早地转换了数据。
【讨论】:
这是完全合法的。 IE。 SELECT id FROM entries WHERE author_id IN (SELECT id FROM authors ORDER BY name DESC) 但您通常会得到相同的结果。
【讨论】:
MySQL 不支持ORDER BY ... LIMIT 在IN 子查询中。