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



在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

最新更新