2010-12-30 7 views
5

불행히도 잘못된 데이터가 포함 된 표가 있는데 일부를 필터링하려고합니다. 나는 데이터 세트가 검증하기에 충분히 작기 때문에 LName, FName 결합이 유일한 것이라고 확신한다. 내가 쿼리 결과를 가지고 싶습니다SQL 거의 중복 된 행을 제거하십시오.

LName, FName, Email 
----- ----- ----- 
Smith Bob [email protected] 
Smith Bob NULL 
Doe Jane NULL 
White Don [email protected] 

는 NULL 이메일이 아직 중복이 없을 때 여전히 NULL 이메일을 다시 가져 오지 않는다 "중복"기록을 다시 가져.

예.

Smith Bob [email protected] 
Doe Jane NULL 
White Don [email protected] 

나는 솔루션 Sql, remove duplicate rows by value 유사하다 생각하지만 아스 커의 요구 사항이 광산과 같은 경우 정말 이해가 안 돼요.

제안 사항?

감사합니다.

+0

Cybernate와 Michael Goldshteyn의 솔루션에 감사드립니다. FooLman b/c와 함께 일을 한 최초의 솔루션이었습니다. 해상도에 대한 다양한 방법을 보는 데 흥미 롭습니다. – jimueller

답변

7

null이 아닌 값이 있으면 null 행을 삭제합니다.

SELECT lname 
     , fname 
     , MIN(email) 
FROM YourTable 
GROUP BY 
     lname 
     , fname 

여기

DECLARE @Test TABLE (
    LName VARCHAR(32) 
    , FName VARCHAR(32) 
    , Email VARCHAR(32) 
) 

INSERT INTO @Test 
    SELECT 'Smith', 'Bob', '[email protected]' 
    UNION ALL SELECT 'Smith', 'Bob', 'NULL' 
    UNION ALL SELECT 'Doe', 'Jane', 'NULL' 
    UNION ALL SELECT 'White', 'Don', '[email protected]' 

SELECT lname 
     , fname 
     , MIN(Email)   
FROM @Test 
GROUP BY 
     lname 
     , fname 
+1

+1 이것은 가장 쉬운 해결책이 게시 된 것입니다. 지역 사회는 과장되어 고통 받고있는 것 같습니다 . –

+0

@Lieven - 그래도 작동하지 않습니다! null이 아닌 요소가없는 경우 null 행을 유지하는 논리는 어디에 있습니까? –

+0

@Martin, 쿼리는 주어진 입력에 대해 op가 요청한 출력을 생성하지 않습니까? 아니면 다시 실행합니까? –

3

표준 SQL을 사용하고 그냥이 수행하는 비교적 간단한 쿼리입니다 테스트 스크립트를

SELECT * FROM Person P 
WHERE Email IS NOT NULL OR -- Take all people with non-null e-mails 
     Email IS NULL AND -- and all people with null e-mails, as long as 
     NOT EXISTS   -- there is no duplicate record of the same person 
      (SELECT *  -- with a non-null e-mail 
      FROM Person P2 
      WHERE P2.LName=P.LName AND P2.FName=P.FName AND P2.Email IS NOT NULL) 
+0

'row_number'가 표준 SQL이 아니라는 것을 암시합니까? –

+0

나는 아무 것도 함축하고 있지 않다. 하위 선택과 관련된 표준 SQL 쿼리 만 사용하는 단순한 솔루션을 제공한다. 그러나 ROW_NUMBER에 대한 질문에 대한 대답을 원한다면 표준 SQL이 아니며 PARTITION BY도 아닙니다. –

+0

ANSI SQL 1999 [여기에 따라] (http://ss64.com/ora/syntax-analytic.html) 어쨌든 표준 SQL이 OP에 의해 지정되지 않았습니다. –

7
당신은 ROW_NUMBER() 분석 기능을 사용할 수 있습니다

:

SELECT * 
    FROM (
       SELECT a.*, ROW_NUMBER() OVER(PARTITION BY LName, FName ORDER BY Email DESC) rnk 
        FROM <YOUR_TABLE> a 
       ) a 
WHERE RNK = 1 
+0

+1 자기 조인보다 더 효율적일 것입니다. 이 기술을 사용하여 내 대답마다 삭제할 ​​수 있습니다. –

1

이미 게시 된 SQL 솔루션이 많기 때문에 불량 데이터를 제거하기 위해 데이터 수정 프로그램을 작성한 다음 불량 데이터가 삽입되지 않도록 필요한 제약 조건을 추가 할 수 있습니다. 데이터베이스의 잘못된 데이터는 잘못된 디자인의 부작용입니다.

+0

나는 그것이 기업 IT 분야에서 그다지 할 수는 없다는 데는 동의하지만 이해할 만하다. 함께 작업해야하는 데이터의 현실입니다. – jimueller

+0

@ jrm82, 엔터프라이즈 애플리케이션에서 이러한 문제를 해결하는 것이 더 중요합니다! 그것이 apin이기 때문에 당신이 그것을하지 말아야한다는 것을 의미하지는 않습니다. 고칠 수 없다면 영원히 문제가 끝나지 않을 것입니다. – HLGEM

+0

HLGEM - 데이터를 소유하지 않고 원하는대로 작업 할 수있는 능력이 없습니다. – jimueller

관련 문제