2013-06-26 165 views
3

请考虑以下删除重复记录的SQL Server

的情况我有一个表像下面

Tag | Id | Client | ....and more columns 
c  30 X 
c  40 Y 
c  50 X 
c  60 A 
c  30 B 
c  40 C 
d  50 D 
d  70 E 
d  80 X 
d  90 Z 
i  30 X 
i  90 Z 
i 100 X 
i  40 M 

我想在这样的方式来选择表中的记录,如果标签= I 行下面得到从结果集中删除

i  30 X 
    i  90 Z 

这是因为id = 90的行已经出现,tag = d和client = Z。 但该行即使ID = 40已经出现了客户

i  40 M 

不能删除= C,因为客户端列值是不同的。

DELETE FROM myTable 
WHERE tag=i AND id IN(SELECT id FROM myTable t1 
         INNER JOIN myTable t2 
         ON t1.id=t2.id 
         WHERE tag=d or tag=c) 
+0

为什么我必须删除'i 100 X'? –

+0

我已经更新了..我必须删除“我30 X” –

回答

3

您可以使用下面CTEROW_NUMBER根据您的规则来检测和删除重复:

WITH CTE AS 
(
    SELECT [Tag], [Id], [Client], 
    RN=ROW_NUMBER()OVER(PARTITION BY [Id], [Client] ORDER BY [Tag]) 
    FROM dbo.Tags 
) 
DELETE FROM CTE 
WHERE RN > 1 
AND [Tag] = @Tag; 

DEMO

删除这些记录:

TAG ID CLIENT RN 
i  30  X  2 
i  90  Z  2 

Over Clause

1

这应该做的伎俩......

declare @Tag as varchar(10) 
set @Tag = 'i' 

    -- The select statement to view the record to be deleted 
    select MyTable.Tag,MyTable.Id,MyTable.Client,RecordToDelete.totalCount from [SampleDB].dbo.[MyTable] 
    inner join 
    (
    SELECT 
     [Id] 
     ,[Client], 
     TotalCount = count(id) 
    FROM [SampleDB].dbo.[MyTable] 
    group by id,Client 
) as RecordToDelete 
    on RecordToDelete.Id=MyTable.Id and RecordToDelete.Client =MyTable.Client 
    where RecordToDelete.totalCount>1 and MyTable.Tag = @Tag 


    -- The delete statement 
    delete [SampleDB].dbo.[MyTable] 
    where MyTable.Tag = @Tag and MyTable.Id in (
     --select MyTable.Tag,MyTable.Id,MyTable.Client,RecordToDelete.totalCount from [SampleDB].dbo.[MyTable] 
     select MyTable.Id from [SampleDB].dbo.[MyTable] 
     inner join 
     (
     SELECT 
      [Id] 
      ,[Client], 
      TotalCount = count(id) 
     FROM [SampleDB].dbo.[MyTable] 
     group by id,Client 
    ) as RecordToDelete 
     on RecordToDelete.Id=MyTable.Id and RecordToDelete.Client =MyTable.Client 
     where RecordToDelete.totalCount>1 and MyTable.Tag = @Tag 
) 
1

你可以试试这个:

 
DELETE FROM DUU 
WHERE EXISTS 
(
    SELECT TAG,ID,CLIENT FROM 
    (
     SELECT TAG,ID,CLIENT FROM DUU A WHERE TAG IN ('I') AND EXISTS (
     SELECT TAG,ID,CLIENT FROM DUU B WHERE TAG IN ('C') AND A.ID=B.ID AND A.CLIENT=B.CLIENT) 
     UNION 
     SELECT TAG,ID,CLIENT FROM DUU A WHERE TAG IN ('I') AND EXISTS (
     SELECT TAG,ID,CLIENT FROM DUU B WHERE TAG IN ('D') AND A.ID=B.ID AND A.CLIENT=B.CLIENT) 
    ) C WHERE DUU.TAG=C.TAG AND DUU.ID= C.ID AND DUU.CLIENT = C.CLIENT 
) 

注:DUU是表的名称。