问题描述
我的表如下所示(在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'
在您的示例结果中,尽管您需要删除重复的N,但P002
却只有N的重复项,因此我也没有删除仅N的重复项。