有什么理由为什么或为什么不应该在子查询中执行'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. GROUP BY查询忽略ORDER BY子句
- 2. ORDER BY在GROUP BY子句
- 3. SQL子查询(使用where和order by子句时出错)
- 4. 在ORDER BY子句中使用SQL查询
- 5. 在SQL中使用ORDER BY子句
- 6. GROUP BY子句中的错误在SELECT UNION ALL ORDER BY查询
- 7. SQL ORDER BY子查询
- 8. ORDER BY和子查询
- 9. ORDER BY CASE与子查询
- 10. SQL ORDER BY子句
- 11. 查询使用ROWNUM和ORDER BY子句不使用索引
- 12. 子查询中的SQL Server ORDER BY子句
- 13. 在SELECT子查询中的ORACLE ORDER BY
- 14. ORDER BY在SQL子句
- 15. 如何使用带有ORDER BY子句的查询结果?
- 16. 对单个查询使用带有ORDER BY的UNION子句
- 17. 优化与SUM,GROUP BY和ORDER连接查询BY子句
- 18. 表访问在Access查询中是否断开Order By子句?
- 19. 使用ORDER BY子句创建视图
- 20. only_full_group_by: “ORDER BY子句是不是在GROUP BY子句”
- 21. ORDER BY子句混乱
- 22. SQL优化ORDER BY子句
- 23. ORDER BY与CASE子句
- 24. 休眠:或ORDER BY子句
- 25. JDBC 4 ORDER BY子句
- 26. ORDER BY子句错误
- 27. TSQL ORDER BY子句几个
- 28. 在SQL Server中使用sum by order by子句
- 29. OVER(order by)语句中的Where子句?
- 30. 我们可以使用group by和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