How to delete the top 1000 rows from a table using Sql Server 2008?

前端 未结 7 994
小鲜肉
小鲜肉 2020-12-01 02:34

I have a table in SQL Server. I would like to delete the top 1000 rows from it. However, I tried this, but I instead of just deleting the top 1000 rows it deleted all the

相关标签:
7条回答
  • 2020-12-01 02:50

    May be better for sql2005+ to use:

    DELETE TOP (1000)
    FROM [MyTab]
    WHERE YourConditions
    

    For Sql2000:

    DELETE FROM [MyTab]
    WHERE YourIdField IN 
    (
      SELECT TOP 1000 
        YourIdField 
      FROM [MyTab]
      WHERE YourConditions
    )
    

    BUT

    If you want to delete specific subset of rows instead of arbitrary subset, you should explicitly specify order to subquery:

    DELETE FROM [MyTab]
    WHERE YourIdField IN 
    (
      SELECT TOP 1000 
        YourIdField 
      FROM [MyTab]
      WHERE YourConditions
      ORDER BY ExplicitSortOrder
    )
    

    Thanks tp @gbn for mentioning and demanding the more clear and exact answer.

    0 讨论(0)
  • 2020-12-01 03:00
    delete from [mytab]
    where [mytab].primarykeyid in
    (
    select top 1000 primarykeyid
    from [mytab]
    )
    
    0 讨论(0)
  • 2020-12-01 03:00
    SET ROWCOUNT 1000;
    
    DELETE FROM [MyTable] WHERE .....
    
    0 讨论(0)
  • 2020-12-01 03:02

    It is fast. Try it:

    DELETE FROM YourTABLE
    FROM (SELECT TOP XX PK FROM YourTABLE) tbl
    WHERE YourTABLE.PK = tbl.PK
    

    Replace YourTABLE by table name, XX by a number, for example 1000, pk is the name of the primary key field of your table.

    0 讨论(0)
  • 2020-12-01 03:05

    As defined in the link below, you can delete in a straight forward manner

    USE AdventureWorks2008R2;
    GO
    DELETE TOP (20) 
    FROM Purchasing.PurchaseOrderDetail
    WHERE DueDate < '20020701';
    GO
    

    http://technet.microsoft.com/en-us/library/ms175486(v=sql.105).aspx

    0 讨论(0)
  • 2020-12-01 03:08

    I agree with the Hamed elahi and Glorfindel.

    My suggestion to add is you can delete and update using aliases

    /* 
      given a table bi_customer_actions
      with a field bca_delete_flag of tinyint or bit
        and a field bca_add_date of datetime
    
      note: the *if 1=1* structure allows me to fold them and turn them on and off
     */
    declare
            @Nrows int = 1000
    
    if 1=1 /* testing the inner select */
    begin
      select top (@Nrows) * 
        from bi_customer_actions
        where bca_delete_flag = 1
        order by bca_add_date
    end
    
    if 1=1 /* delete or update or select */
    begin
      --select bca.*
      --update bca  set bca_delete_flag = 0
      delete bca
        from (
          select top (@Nrows) * 
            from bi_customer_actions
            where bca_delete_flag = 1
            order by bca_add_date
        ) as bca
    end 
    
    0 讨论(0)
提交回复
热议问题