[英]Is order by clause allowed in a subquery
有没有理由为什么或为什么不在子查询中执行'order by'?
是的:不应该这样做,因为它在概念上没有意义。
子查询将在一些外部查询中使用(否则它将毫无意义),并且外部查询无论如何都必须进行排序,因此没有必要对子查询进行排序。
这是因为SQL中的查询结果将没有特定的顺序,除非您使用显式的ORDER。 因此,即使您在子查询中使用了ORDER,也无法保证这会影响外部查询的结果顺序; 所以这毫无意义。
它当然可以在某些特定的RDBMS中产生差异,因为它的实现,但这将是特定于实现的,而不是你应该依赖的东西。
编辑:当然,如果在子查询中使用TOP或LIMIT, 则需要使用ORDER。 但是那不是标准的SQL ......
如果子查询使用某种LIMIT
/ TOP
,则应该使用它。
除非子查询包含TOP
或FOR 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.