基于多列删除重复项
Deleting duplicates based on multiple columns
我使用以下列出了重复项:
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
上应用唯一索引)。
使用 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
制作样本数据
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' )
--做删除数据
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
我使用以下列出了重复项:
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
上应用唯一索引)。
使用 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
制作样本数据
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' )
--做删除数据
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