2017-01-03 2 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 

, 나는 메시지 중 하나 (내가 고유을 적용 할 수 있도록 중복을 제거하기 위해 노력하고 있지만 모두 삭제 어떻게 index on 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을 사용하고 중복 쌍에 대해 하나만 제외하고 행 번호를 할당하십시오. ID와 같은 라인을 지정, 당신은 할 수 표시 할 열이없는 경우

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 

줄의 주소를 사용하려고 시도하십시오 (예 : %% 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