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

我想以这样的方式从表中选择记录,如果 tag=i 下面的行从结果集中删除

  i     30    X
  i     90    Z

这是因为 id=90 的行已经出现了 tag=d 和 client=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 )
4

3 回答 3

3

您可以使用以下CTEwithROW_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

过条款

于 2013-06-26T07:06:03.710 回答
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
  )
于 2013-06-26T07:34:32.623 回答
1

你可以试试这个:

从 DUU 中删除
存在于何处
(
    选择标签、ID、客户来自
    (
        从 DUU 中选择 TAG、ID、CLIENT A WHERE TAG IN ('I') 并且存在 (
        从 DUU B 中选择 TAG、ID、CLIENT,其中 TAG IN ('C') AND A.ID=B.ID AND A.CLIENT=B.CLIENT)
        联盟
        从 DUU 中选择 TAG、ID、CLIENT A WHERE TAG IN ('I') 并且存在 (
        选择 TAG,ID,CLIENT 从 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 是表的名称。

于 2013-06-26T08:32:06.887 回答