2012-06-27 2 views
0

값이 같지 않아야하는 열이있는 테이블이 있습니다. 열악한 구현 소프트웨어로 인해 사용자가 복제본을 입력했는지 여부를 확인하지 않기 때문에 열의 모든 값을보고 "단순한"SQL 문이나 함수를 작성하는 작업을 위탁 받았습니다. 같은. SQL 자체는 한 달에 한 번 실행되므로 효율적 일 필요는 없습니다.값이 열에서 동일하지 않음을 확인하십시오.

컬럼은 int를 저장하고 중복 값 중 하나를 증가시키고 컬럼에 대해 동일한 값을 가진 항목이 더 이상 없을 때까지 계속 수행합니다. 내가해야 할 모든 제안? 어디서부터 시작해야할지 모르겠습니다.

통찰력있는 사람 덕분입니다.

편집 : 죄송합니다. 중복되지 않은 데이터의 값은 그대로 유지해야합니다. 이는 고객에게 사용되는 설정이며, 값이 중복되는 경우에만이를 처벌해야합니다. 그렇지 않으면 우리는 그들의 환경을 파괴해서는 안됩니다. 그렇지 않으면 화가 날 것입니다.

많은 열을 포함하고있는 하나의 테이블이지만 int 유형이며 특히 null이 포함되지 않은이 특정 열은 중복되지 않아야합니다.

+0

해당 열은 무엇을 위해 사용됩니까? –

+0

@Quillion, 확인해야하는 열의 수는 테이블 구조도 정교하게 작성하십시오. –

+0

이 열은 다른 테이블이나 데이터에서 참조합니까? 원래 auto_increment 열이었던 것처럼 들리지만 이제는 값을 다시 한번 고유하게 만들려고합니다. 그러나 그렇다면 외래 키 제약 조건이없는 곳에서도 외래 키로 사용할 가능성이 있습니다. 또한, 당신이 복제물에 어떤 새로운 가치를 부여하는지는 정말로 중요합니까? 사용되지 않는 정수가 될 수 있습니까? – MatBailie

답변

1
create table tableName (KeyCol int identity(1,1), intCol int) 
insert into tableName values (1), (2), (2), (3), (5), (6), (5), (7), (9) 


While exists (
    select intCol 
    from tableName 
    group by intCol 
    having count(*) > 1 
) 
begin 

    declare @newValue int 

    select @newValue = min(t1.intCol) + 1 
    from tableName t1 
    left join tableName t2 
    on t1.intCol + 1 = t2.intCol 
    where t2.intCol is null 

    update tx 
    set intCol = @newValue 
    from tableName tx 
    where intCol = 
    (select top 1 intCol 
    from tableName t1 
    group by intCol 
    having count(*) > 1 
    order by intCol) 
    and KeyCol = (select min(KeyCol) from tableName t2 where t2.intCol = tx.intCol) 
end 

select * from tableName order by 2 
+0

제 코드에는 버그가 가득했습니다. SQL2008의 작동 버전은 다음과 같습니다. http://sqlfiddle.com/#!3/19801/2 – Sean

+0

감사합니다. 나는 그것을 시도하고 그것을 작동, 이것은 훌륭한 솔루션입니다! – Quillion

0

왜이 열을 삭제하고 다시 고유 한 데이터로 다시 만들거나 다시 채우지 않을까요? UNIQUE INDEX?

+0

이러한 값을 다시 지정하는 것이 가능하면 모든 번호를 다시 지정할 수 있습니다. 어떤 경우에는 좋은 빠른 옵션 일 수 있습니다. OP가 문제의 원인을 암시한다는 것을 제외하고는 수정되지 않으며, 매월 다시 실행되어 느리고 느리게 진행됩니다. Arg! *** [OP는 방금이 옵션이 아니라고 말하는 편집을 게시했습니다.] *** – MatBailie

+0

변경 될 수 있기 때문에 그 값이 중요하지 않은 경우 자동 인식 열이 사용될 수 있습니다. – ALZ

1

문제의 크기에 대한 아이디어를 얻으려면 다음과 같이 해보십시오. mysql을 모르지만 동등한 것이 있어야합니다.

SELECT your_col, COUNT(your_col) 
    FROM your_table 
GROUP BY your_col 
난 정말 당신이 중복을 효과적으로 증가 할 때마다 후, 첫 번째 해결하는 동안, 당신이 잘 당신이에서 다시 확인해야 할 것 또 다른 복사본을 만들 수 있습니다 갈 길을 찾을 때 값을 증가 생각하지 않는다

시작. 올바른 접근법은 중복을 거부하기 위해 데이터를 입력하는 데 사용되는 모든 것에 유효성 검사를 추가하는 것입니다. 그렇다면 최소한 데이터를 한 번만 정리하면됩니다. 그건 당신이 일주일에 한 번, 적어도 장기적으로 저렴하지 않을 것이다 SQL을 실행 :-)

에 대한 귀하의 회사가 잘못

ETA를 바라고 무엇 아니라면

죄송합니다. 당신은 바늘이 필요한 무언가에 석고를 때리고 있습니다. 지금 히트를 치고 근원적 인 문제를 해결하는 것, 처음에는 어떤 복제본도 원하지 않는 칼럼을 입력하고 어쨌든 입력 할 수있게하는 것이 훨씬 낫다. 시작해야 할 majot WTF가 있습니다.

관련 문제