删除重复记录 SQL Server

3
请考虑以下场景:
我有一个如下所示的表格:

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且标签为d、客户端为Z的行已经出现过。 但是这一行


i     40    M

即使id=40已经与client=C出现过,也不能删除此行,因为client列的值不同。

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 )

为什么必须删除 i 100 X - Tim Schmelter
我已经更新了它...必须删除 i 30 X - Mudassir Hasan
3个回答

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;

演示

删除这些记录:

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

OVER 子句


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
你可以尝试这样做:
删除 DUU 表中满足以下条件的记录:
存在一条记录 TAG、ID、CLIENT 均与 DUU 表中某条记录相同,
且该记录中 TAG 为 'I',同时存在另外一条记录 TAG 为 'C' 或 'D',且 ID 和 CLIENT 与前述记录相同。
注意:DUU 是表名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接