为什么DELETE TOP(X)语句不删除与先前SELECT TOP(X)返回的记录相同的记录?

时间:2019-03-11 17:53:05

标签: sql-server

正如标题所述,我一直在运行此命令以从表中删除一些记录,但是我注意到,如果我运行查询直接选择了TOP(X)个记录,它并没有删除列出的相同记录。

DELETE命令是否应遵循与SELECT相同的默认顺序?如果没有,为什么?

我不知道这是否重要,但这是我正在运行的删除命令:

DELETE TOP (100000) t
FROM Ticket AS t
    LEFT JOIN Series s on t.SeriesId = s.id
    LEFT JOIN Payment p on t.id = p.TicketId
WHERE s.EndDate <= DATEADD(MONTH, -1, GETDATE()) AND t.ExportDate is null AND p.TicketId is null

对于选择,只需将第一行替换为SELECT TOP(100000) t.*

2 个答案:

答案 0 :(得分:13)

在没有ORDER BY的情况下,可以保证数据不能的顺序。

答案 1 :(得分:3)

不。没有“默认顺序”。如果您未指定ORDER BY,则任何排序均有效。

所得到的顺序将取决于执行计划,甚至在给定的执行计划中也可能不稳定(例如,并行性可能会将行分配给具有不同分配方式的不同线程,具体取决于每个调度程序当时的繁忙程度)

此外,即使忽略ORDER BY问题,TOPSELECT的语义也不同。如果给定的DELETESeries中有多个匹配项(并且与Ticket匹配),EndDate将计入连接的行,而SELECT将折叠这些行删除前减少到1,只计算从DELETE中删除的行。

要以确定性的方式执行Ticket,您可以首先构造一个对此有效的DELETE语句(所有联接都被SELECT / EXISTS取代)然后您可以将其放在CTE中并从中删除。

NON EXISTS