2017-12-18 15 views
1

안녕하세요, 중복 된 사용자 이름이있는 로그인 테이블이 있습니다. 예 제약 조건을 넣어야한다고 알고 있지만, 지금은 너무 늦었습니다.T-SQL을 사용하여 중복 제거 방법

기본적으로 내가하고 싶은 것은 먼저 중복 된 것을 식별하는 것입니다. 올바른 계정인지 확실하지 않으므로 삭제할 수 없습니다. 계정의 사용자 이름은 동일하며 둘 다 약간의 차이가있는 대략 동일한 정보를 가지고 있습니다.

효율적으로 스크립트를 작성하여 복제본 당 하나의 계정에만 "_duplicate"를 추가 할 수 있습니까?

+0

중복 된 항목을 확인하셨습니까? 당신은 어떤 질문이 있습니까? –

답변

1

당신은 중복을 찾기 위해 OVER() 절에 PARTITION BYROW_NUMBER을 사용할 수 있으며 업데이트 가능한 CTE 그에 따라 값을 변경할 수 :

DECLARE @dummyTable TABLE(ID INT IDENTITY, UserName VARCHAR(100)); 
INSERT INTO @dummyTable VALUES('Peter'),('Tom'),('Jane'),('Victoria') 
          ,('Peter')  ,('Jane') 
          ,('Peter'); 
WITH UpdateableCTE AS 
(
    SELECT t.UserName AS OldValue 
      ,t.UserName + CASE WHEN ROW_NUMBER() OVER(PARTITION BY UserName ORDER BY ID)=1 THEN '' ELSE '_duplicate' END AS NewValue 
    FROM @dummyTable AS t 
) 
UPDATE UpdateableCTE SET OldValue = NewValue; 

SELECT * FROM @dummyTable; 

당신은으로 ROW_NUMBER()를 포함 할 수 있습니다

ID UserName 
1 Peter 
2 Tom 
3 Jane 
4 Victoria 
5 Peter_duplicate 
6 Jane_duplicate 
7 Peter_duplicate 

결과를 다른 서지는 중복 서수를 찾습니다. 1으로 번호가 매겨진 가장 빠른 (또는 최신이어야하는) 정렬 절이 있으면 중복을 찾아서 쉽게 수정할 수 있어야합니다.

일단이 혼란을 청소하면 새로운 dup을 확보하지 않아야합니다. 그러나 당신은 이미 이것을 알고 있습니다 :-D

0

이 악몽을 없애기위한 쉬운 방법은 없습니다. 일부 직접 조치가 필요합니다.
먼저 중복 된 것을 식별하십시오.

select * from dbo.users 
where userId in 
(select userId from dbo.users 
    group by username 
    having count(userId) > 1) 

다음은 "쓸모없는"사용자 (예 : 등록했지만 결코 주문하지 않는 사용자)를 식별합니다.
위의 쿼리를 다시 실행하십시오. 이 목록에서 (예를 들어 이메일로) 동일한 중복을 찾아서 하나의 레코드로 결합합니다. 이전에 유용했던 일 (예 : 주문 주문)을 수행 한 경우 먼저 이러한 명령을 생존 한 사용자에게 할당하십시오. 다른 사람들을 제거하십시오.
중복을 제거 할 때까지 다른 기준을 계속하십시오.
그런 다음 uniqueusername 필드로 제한하십시오. email 필드에 unique 제약 조건을 설정하는 것도 좋습니다.
다시 말하지만 쉽지 않고 자동이 아닙니다.

0

원본 이름에 약간의 차이가있는이 경우 중복 된 행을 선택하는 것이 불가능합니다. 어떤 행이 실제이고 어떤 것이 중복되는지를 모르기 때문입니다.

나는 데이터를 수정 한 다음이 변형이 중복 된 곳에서 수정하는 것이 가장 좋습니다.

+0

질문을 읽으면 OP의 필요성이 정확히 묘사 된 것입니다 (중복 된 것을 식별하고 수동으로 다시 작업하십시오). 그러나 질문은 : 이것은 어떻게 행해질 수 있는가? – Shnugo