有什么理由为什么或者为什么不在子查询中执行'order by'?
答案 0 :(得分:12)
是的:不应该这样做,因为它在概念上没有意义。
子查询将在一些外部查询中使用(否则它将毫无意义),并且外部查询无论如何都必须进行排序,因此没有必要对子查询进行排序。
这是因为SQL中的查询结果没有特定的顺序,除非您使用显式的ORDER。因此,即使您在子查询中使用了ORDER,也无法保证这会影响外部查询的结果顺序;所以这毫无意义。
由于它的实现,它当然可能会对某些特定的RDBMS产生影响,但这将是特定于实现的,而不是你应该依赖的东西。
编辑:当然,如果在子查询中使用TOP或LIMIT,将需要使用ORDER。但是那不是标准的SQL ......
答案 1 :(得分:11)
如果子查询使用某种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
答案 2 :(得分:3)
除非你使用top,否则它没用,因为无论如何你都会在外部查询中订购
答案 3 :(得分:2)
聪明的人说这不是正确/有效的方式。 在我的情况下,子查询中的SELECT TOP 100 PERCENT解决了这个问题。
干杯
答案 4 :(得分:1)
答案 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)
但你通常会得到相同的结果。