为什么允许DELETE TOP而不允许ORDER BY ?为什么不允许DELETE TOP with ORDER BY ?
这不是违背了不应该有"自然的"吗?在SQL行顺序?
解决方法是
DELETE FROM table WHERE id IN (
SELECT TOP n id FROM table WHERE ... ORDER BY ...)
类似的问题,对于UPDATE TOP (n), ORDER BY是不允许的。为什么?
为什么不呢:因为只有在非常特殊的情况下才有意义。DELETE
或UPDATE
没有结果。ORDER BY
和TOP
仅在批处理场景中有意义。不管出于什么原因,选择行的工作是SELECT
的工作。在ANSI SQL中,选择要删除的一批行的工作是SELECT子查询的工作
SQL Server的DELETE TOP
或MySQL的DELETE ... LIMIT
是扩展。PostgreSQL不允许在DELETE
中使用LIMIT或FETCH FIRST
。
这并不意味着有某种顺序。服务器可以自由地以最便宜的方式返回数据,TOP
适用于这些结果。如果服务器决定并行化查询或使用不同的连接策略,则顺序可以改变。
在其他数据库中,您也可以使用LIMIT
或FETCH FIRST
而不使用ORDER BY
。LIMIT
,FETCH FIRST
或TOP
不属于ORDER BY
子句
在MySQL中,LIMIT
可以在没有ORDER BY
的情况下应用。从文档示例中:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
PostgreSQL允许LIMIT和ANSI SQLFETCH FIRST
,例如:
SELECT * FROM foo FETCH FIRST 10 ROWS ONLY;
至于为什么,UPDATE和DELETE不会产生结果,所以ORDER BY
没有意义。