从同一SQL表中删除重复项

问题描述

我的表如下所示(在sql Server 2016 SP2中):

KEY | CN_ID | CNO_IND
----+-------+--------
001 | P001  | N
002 | P001  | Y
003 | P001  | N
005 | P002  | N
006 | P002  | N
007 | P004  | N
008 | P004  | Y
009 | P004  | N
010 | P004  | Y

这就是我想要做的:

对于所有CNO_IND ='Y'的CN_ID,我想删除所有CNO_IND ='N'的CN_ID。

我的最终结果将是这样:

KEY | CN_ID | CNO_IND
----+-------+--------
002 | P001  | Y
005 | P002  | N
006 | P002  | N
008 | P004  | Y
010 | P004  | Y

如您所见,由于P002都没有CNO_IND ='Y',因此不会删除P002。 P004仍然有重复项,因为我想保留CNO_IND ='Y'的所有记录,并删除CNO_IND ='N'的重复项。

希望为此找到最佳解决方案。

预先感谢

解决方法

一个选项使用exists

delete t
from mytable t
where cno_ind = 'N' and exists (
    select 1 from mytable t1 where t1.cn_id = t.cn_id and t1.cno_ind = 'Y'
)
,

您可以使用CTE之类的东西

With CTE as (
Select KEY,CN_ID,CNO_IND,Row_Number() over (Partition by CN_ID  Order By CN_ID) as rnk from YourTable
)

Delete from CTE where rnk > 1
,

但是您仍然可以使用CTE做到这一点

With del as (
  Select
    [KEY],max(case CNO_IND when 'Y' then 'Y' end) over (Partition by CN_ID) as has_y
  from tab
)

delete
from del
where has_y = 'Y'
  and cno_ind = 'N'

Fiddle

在您的示例结果中,尽管您需要删除重复的N,但P002却只有N的重复项,因此我也没有删除仅N的重复项。