老生常談刪除SQL表中重復(fù)記錄

字號:

有時候經(jīng)常加錯數(shù)據(jù),或一條數(shù)據(jù)多加了幾篇,今天再來說說SQL數(shù)據(jù)庫中重復(fù)記錄的刪除方法。
    數(shù)據(jù)庫結(jié)構(gòu)的腳本:
    if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[TempA]’) and OBJECTPROPERTY(id, N’IsUserTable’) = 1)
    drop table [dbo].[TempA]
    GO
    CREATE TABLE [dbo].[TempA] (
     [id] [int] IDENTITY (1, 1) NOT NULL ,
     [PositionName] [varchar] (256) COLLATE Chinese_PRC_CI_AS NULL ,
     [EnglishPositionName] [varchar] (256) COLLATE Chinese_PRC_CI_AS NULL
    ) ON [PRIMARY]
    GO
    ALTER TABLE [dbo].[TempA] ADD
     CONSTRAINT [PK_TempA] PRIMARY KEY CLUSTERED
     (
     [id]
     ) ON [PRIMARY]
    GO
    TempA表中有三個字段,id且為主鍵,自動增長; PositionName,EnglishPositionName中有重復(fù)的記錄,比如:
    id PositionName EnglishPositionName
    20 其他 Others
    21 質(zhì)量工程師 QC Engineer
    22 其他 Others
    .......
    100 質(zhì)量工程師 QC Engineer
    需要剔除重復(fù)的"其他","質(zhì)量工程師"等記錄。
    采用的SQL語句:
    Delete from TempA where id not in (
     select max(t1.id) from TempA t1 group by
     t1.PositionName,t1.EnglishPositionName)
    說明:
    (1)需要剔除那幾個用于判斷重復(fù)的字段,則將它們放在group by語句之后。
    (2)max(t1.id) 也可以改成:min(t1.id)