从表中删除具有一些排序的前N行(按'列'排序)

Sha*_*hah 32 sql t-sql sql-server

我对某些专栏删除前N行的订单感到困惑.

我在这里创建了一个示例,例如小提琴

这些查询有什么问题?

 Delete Top(3) from Table1 order by id desc

 Delete Top(3) from Table1 
 where id IN (select id from Table1 order by id desc)
Run Code Online (Sandbox Code Playgroud)

因为在mysql中,limit关键字可以很好地完成工作

Mar*_*ith 71

您可以使用CTE执行更快的有序删除,而无需单独的子查询来检索前3个ID.

WITH T
     AS (SELECT TOP 3 *
         FROM   Table1
         ORDER  BY id DESC)
DELETE FROM T 
Run Code Online (Sandbox Code Playgroud)

  • 这是_THE_答案...谢谢。 (2认同)
  • @MartinSmith我只将它们用于递归。除此之外,CTE 只是子查询和“代码气味”(对我来说)。如果开发人员告诉我他们需要 CTE 来使某些内容更具可读性且更易于管理,那么这告诉我查询可能需要分解为视图或函数。这是一个偏好问题,也是一种对我很有帮助的编程实践。我知道我在这里属于少数派,而且它更容易阅读,但是当我滚动代码页(CTE 的方式在顶部)并试图在看到他们的别名时回忆他们的内容时,这让我发疯加入了。 (2认同)

Cri*_*scu 10

top 3子句添加到子选择中:

Delete from Table1 
where id IN (
    select top 3 id 
    from Table1 
    order by id desc
)
Run Code Online (Sandbox Code Playgroud)

  • 请务必小心使用引用同一个表的“IN”。我有一个非常相似的查询来删除 3 行,但“ORDER BY”不同,它当然没有删除 3 行。我没有意识到其中的相互关联性。 (2认同)