有什么理由为什么或为什么不应该在子查询中执行'order by'?在子查询中允许使用order by子句
回答
是的:不应该这样做,因为它在概念上没有意义。
子查询将用于某些外部查询(否则它将毫无意义),并且该外部查询将必须进行排序,因此没有必要排序子查询。
这是因为SQL中的查询结果不会按特定顺序出现,除非使用明确的ORDER。因此,即使您在子查询中使用了ORDER,也无法保证这会影响外部查询结果的顺序;所以没有意义。
它可能会因为它的实现而在某些特定的RDBMS中有所作为,但这将是特定于实现的,而不是您应该依赖的。
编辑:当然,如果你在子查询使用TOP或限制,您将需要使用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
根据子查询的大小,它会影响性能对不同程度。
尽管在子查询上顺序应该没有关系。您应该能够将Order By部分移动到Outer Query(应该是返回最终结果的部分)。
这是完全合法的。即SELECT id FROM entries WHERE author_id IN (SELECT id FROM authors ORDER BY name DESC)
,但你通常会得到相同的结果。
除非你使用上面它是没有用的,因为你将在外部查询被定购无论如何
没有ORDER BY是当你有兴趣在整体数据的子集的子查询有效,所以你总是需要一个TOP
(SQL Server)。在子查询中没有没有TOP的ORDER BY是没有意义的,因为结果的整体排序是由外部查询处理的。
你不应该使用它。根据'艺术的SQL',这实际上阻止了优化器执行各种优化,否则它可以做,因为这种优先转换数据。
更聪明的人认为这不是正确/有效的方法。 在我的案例中,SELECT TOP 100 PERCENT在子查询中解决了这个问题。
干杯
- 1. ORDER BY子句中的子查询MySQL
- 2. GROUP BY查询忽略ORDER BY子句
- 3. ORDER BY子句中UNION ALL SQL查询
- 4. ORDER BY在GROUP BY子句
- 5. SQL子查询(使用where和order by子句时出错)
- 6. 如何在内部查询中使用order by子句
- 7. 在ORDER BY子句中使用SQL查询
- 8. 在SQL中使用ORDER BY子句
- 9. 在cassandra中使用order by子句
- 10. GROUP BY子句中的错误在SELECT UNION ALL ORDER BY查询
- 11. ORDER BY CASE与子查询
- 12. ORDER BY和子查询
- 13. SQL ORDER BY子句
- 14. 查询使用ROWNUM和ORDER BY子句不使用索引
- 15. 子查询中的SQL Server ORDER BY子句
- 16. 在SELECT子查询中的ORACLE ORDER BY
- 17. ORDER BY子句中的MySQL
- 18. ORDER BY在SQL子句
- 19. 子查询Group By子句
- 20. 无法优化使用ORDER BY子句的MySQL查询
- 21. 对单个查询使用带有ORDER BY的UNION子句
- 22. 使用ORDER BY子句时,Mysql SLOW UNION查询
- 23. 如何使用带有ORDER BY子句的查询结果?
- 24. 优化与SUM,GROUP BY和ORDER连接查询BY子句
- 25. GROUP BY和ORDER BY子句导致查询速度慢
- 26. 表访问在Access查询中是否断开Order By子句?
- 27. 无法在复杂查询中实现ORDER BY子句
- 28. T-SQL:WHERE子句中OVER(PARTITION BY ... ORDER BY ...)
- 29. 在查询中使用ORDER BY GROUP BY
- 30. 使用ORDER BY子句创建视图
通常?你能否给出结果会有所不同的情况? – sleske 2010-01-20 14:20:14
如果您将LIMIT语句添加到子查询中,它将有所不同。在这种情况下,如果您想按名称查看前5位作者的所有条目,则可以将您的子查询更改为(SELECT ID FROM authors ORDER BY name DESC LIMIT 5)。 – loginx 2010-01-20 14:24:08
是的。通过TOP/LIMIT,它会产生变化(并且有必要,有时甚至是必需的)。否则,它没有区别。 – sleske 2010-01-20 15:39:10