【问题标题】:Why is DELETE TOP without ORDER BY allowed?为什么允许没有 ORDER BY 的 DELETE TOP?
【发布时间】:2022-11-30 18:49:10
【问题描述】:

为什么允许没有 ORDER BY 的 DELETE TOP? 为什么不允许使用 ORDER BY DELETE TOP?

在 SQL 中不应有行的“自然”顺序,这难道不违背吗?

解决方法是

DELETE FROM table WHERE id IN (
  SELECT TOP n id FROM table WHERE ... ORDER BY ...)

类似的问题,对于 UPDATE TOP (n) ,不允许使用 ORDER BY。为什么?

【问题讨论】:

  • 您可以将SELECT TOP 添加到列表中。这并不意味着有任何秩序。服务器可以以最便宜的方式免费返回数据,TOP 适用于这些结果。在其他数据库中,您也可以使用不带 ORDER BYLIMITFETCH FIRST
  • TOP 允许没有 ORDER BY(在大多数地方);它与您使用DELETE 的事实无关。至于你关于“自然秩序”的观点,没有自然秩序。如果没有 ORDER BY,SQL Server 将简单地以任意顺序处理行。
  • DML 语句中 TOP 的主要用法(如 UPDATE/DELETE)是在批处理时,在这种情况下,排序数据实际上不太可能很重要,因为它是 WHERE将数据过滤到您想要影响的行。如果您在每次迭代中任意 UPDATE 100 万行,则不会改变最终目标,即所有适用的行都将是 UPDATEd;这些行的顺序是什么 UPDATEd 是无关紧要的。

标签: tsql


【解决方案1】:

SELECT TOP可以添加到列表中。这并不意味着有任何秩序。服务器可以以最便宜的方式免费返回数据,TOP 适用于这些结果。如果服务器决定并行查询或使用不同的连接策略,则顺序可能会发生变化。

在其他数据库中,您也可以使用不带 ORDER BYLIMITFETCH FIRSTLIMITFETCH FIRSTTOP 不是 ORDER BY 子句的一部分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多