SQL Server:删除4列匹配的重复项,但将具有特定值的重复项保留在另一列中
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
要在SQL Server中删除具有四列匹配的重复项,但保留另一列中具有特定值的重复行,您可以使用ROW_NUMBER()
窗口函数配合CTE(Common Table Expression)
来实现这一需求。以下是一个示例SQL脚本,假设您有以下需求:
YourTable
Column1
, Column2
, Column3
, Column4
SpecialColumn
DesiredValue
WITH CTE_Duplicates AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY Column1, Column2, Column3, Column4 -- 分组依据四列
ORDER BY SpecialColumn DESC -- 保留SpecialColumn为DesiredValue的行优先
) AS RowNum
FROM YourTable
WHERE SpecialColumn <> 'DesiredValue' -- 先排除SpecialColumn为DesiredValue的行
)
DELETE FROM CTE_Duplicates
WHERE RowNum > 1; -- 删除分组后RowNum大于1的行,即除保留行之外的重复行
步骤说明:
定义CTE: 使用WITH
语句创建一个临时的结果集(CTE),在这个CTE中,通过ROW_NUMBER()
函数为每个四列匹配的组分配一个唯一的行号。这里的关键是通过PARTITION BY
子句指定了哪些列为分组依据,确保了只有这些列完全相同的记录才会被看作重复。
排序规则: 在ORDER BY
子句中,我们指定按SpecialColumn
降序排列。这样,如果存在SpecialColumn
为DesiredValue
的行,它将获得最低的行号(即1),从而在后续的删除操作中得以保留。
筛选与删除: 在CTE定义之后,执行DELETE
操作,仅删除那些在CTE中RowNum
大于1的记录,这意味着除了每组中按照上述规则保留的第一行外,其他所有重复行都将被删除。
请注意,执行此类删除操作前,请务必做好数据备份,以防止意外数据丢失。此外,根据您的实际表结构和字段名称调整上述脚本。