繁体   English   中英

T-SQL删除一半没有主键的重复项

[英]T-SQL Delete half of duplicates with no primary key

在T-SQL存储过程中,我有一个复杂的过程,即使用临时表比较数据,但是当我返回单个表时,最终会出现重复的行。 在这些行中,行中的所有列都完全相同,并且此表中没有主键。 我需要根据行发生的次数仅删除其中的一半。 例如,如果有八行都是相同的值。 我想删除其中的四个。

没有办法通过我的SP过滤摆脱它们,因为输入的数据实际上是用户输入的重复信息,但我确实需要一半的信息。

我已经对这个主题进行了一些研究,并进行了一些测试,但似乎不可能删除一半重复的行。 这不可能吗? 或者有办法吗?

这是一种方法,使用SQL Server的一个很棒的功能,可更新的CTE:

with todelete as (
      select t.*,
             row_number() over (partition by col1, col2, col3, . . . order by newid()) as seqnum
      from table t
     )
delete from todelete
    where seqnum % 2 = 0;

这将删除所有其他值。

假设SQL Server 2005+:

;WITH CTE AS
(
    SELECT  *,
            RN=ROW_NUMBER() OVER(PARTITION BY Col1, Col2,...Coln ORDER BY Col1)
    FROM YourTempTableHere
)
DELETE FROM CTE
WHERE RN = 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM