2017-01-03 224 views
1

我列出重复如下:删除重复

select s.MessageId, t.* 
from Message s 
join (
    select ToUserId, FromUserId, count(*) as qty 
    from Message 
    group by ToUserId, FromUserId 
    having count(*) > 1 
) t on s.ToUserId = t.ToUserId and s.FromUserId = t.FromUserId 

现在,我怎么删除所有,但消息中的一个(我想删除重复这样我就可以申请一个独特的索引FromUserId and ToUserId)。

+0

[卸下重复行(基于从多个列中的值)从SQL表]的可能的复制(http://stackoverflow.com/questions/30243945/removing-duplicate-rows-based-on- values-from-multiple-columns-from-sql-table) – FuzzyTree

+0

@FuzzyTree为什么你会投票结束,如果有已经有用的答案? – SB2055

+0

因为它仍然是一个重复的问题和重复的问题杂乱的网站,没有提供任何价值未来的游客 – FuzzyTree

回答

5

使用cte并分配行号,以便可以删除除重复对之外的所有对。

with rownums as 
(select m.*, 
row_number() over(partition by ToUserId, FromUserId order by ToUserId, FromUserId) as rnum 
from Message m) 
delete r 
from rownums r 
where rnum > 1 
0

制作试样数据

DECLARE @Message TABLE(ID INT ,ToUserId varchar(100),FromUserId varchar(100)) 
    INSERT INTO @Message(ID,ToUserId, FromUserId) 
    VALUES (1,'abc', 'def' ), (2,'abc', 'def' ), (3,'abc', 'def' ), (4,'qaz', 'xsw' ) 

--Do删除数据

DELETE m FROM @Message AS m 
    INNER JOIN (
     SELECT *,row_number()OVER(PARTITION BY ToUserId,FromUserId ORDER BY ID) AS rn FROM @Message AS m 
    ) t ON t.ID=m.ID 
    WHERE t.rn>1 

    SELECT * FROM @Message 
 
----------- ---------- ---------- 
1   abc  def 
4   qaz  xsw 

如果没有列指示指定行ID,就可以尝试使用行的地址(例如%% lockres% %)

DELETE m FROM @Message AS m 
    INNER JOIN (
     SELECT *,row_number()OVER(PARTITION BY ToUserId,FromUserId ORDER BY %%lockres%%) AS rn FROM @Message AS m 
    ) t ON t.ID=m.ID 
    WHERE t.rn>1 

    SELECT *, %%lockres%% FROM @Message