2017-09-04 3 views
0

다양한 테이블의 여러 열을 기반으로 한 데이터베이스의 중복을 식별하고 싶습니다. 아래 예제에서 1 & 5 및 2 & 4는 4 개의 열 모두 동일한 값을 갖기 때문에 중복됩니다. SQL을 사용하여 그러한 레코드를 어떻게 식별합니까? 단일 열을 기반으로 중복을 식별해야 할 때 count> 1을 사용하여 그룹을 사용했지만 여러 열을 기반으로 중복을 식별하는 방법을 잘 모르겠습니다. 그러나, 4 열 모두를 기반으로하여 count> 1을 갖는 그룹을 만들 때, # 3과 6이 나타나기 때문에 기술적 요구 사항에 따라 중복되지 않습니다.여러 열을 기준으로 중복 확인

T1

ID | Col1 | Col2 
---| --- | --- 
1 | A | US 
2 | B | FR 
3 | C | AU 
4 | B | FR 
5 | A | US 
6 | D | UK 

T2

ID | Col1 
---| ---    
1 | Apple 
1 | Kiwi 
2 | Pear 
3 | Banana 
3 | Banana 
4 | Pear 
5 | Apple 

T3

ID | Col1  
---| --- 
1 | Spinach 
1 | Beets 
2 | Celery 
3 | Radish 
4 | Celery 
5 | Spinach 
6 | Celery 
6 | Celery 

내 예상 된 결과는 다음과 같습니다

1 A US Apple Spinach 
5 A US Apple Spinach 
2 B FR Pear Celery 
4 B FR Pear Celery 
+0

그룹에서'and condition'을 (를) 사용 하시겠습니까? –

+0

예상 결과는 무엇입니까? – zarruq

+0

내 질문이 업데이트되었습니다. – Skn

답변

0

결과 집합에 고유 한 ID 열을 포함시켜야하는 문제가 있습니다. 그래서 단순한 GROUP BY ... HAVING은 그것을 자르지 않을 것입니다. 이것은 효과가있다.

with cte as 
    (select t1.id 
       , t1.col1 as t1_col1 
       , t1.col2 as t1_col2 
       , t2.col1 as t2_col1 
       , t3.col1 as t3_col1 
     from t1 
      join t2 on t1.id = t2.id 
      join t3 on t1.id = t3.id 
    ) 
select cte.* 
from cte 
where (t1_col1, t1_col2, t2_col1, t3_col1) in 
     (select t1_col1, t1_col2, t2_col1, t3_col1 
     from cte 
     group by t1_col1, t1_col2, t2_col1, t3_col1 having count(*) > 1) 
/

하위 쿼리 인수 구문의 사용은 선택 사항이지만, 나는 그것이 유용 서브 쿼리가 쿼리에 하나 이상의 사용되는 신호를 찾을 수 있습니다.


"나는 데이터를 다른 시나리오가 발생했습니다는 ID의 일부는 T2와 T3에서 같은 값을 가지고 그들은 DUPS로 나타나고있다"고 말했다.

하위 테이블의 중복 된 ID로 인해 조인 된 하위 쿼리에서 카디 전 제품이 생성되어 주 결과 집합에서 오탐 (false positive)이 발생합니다. 이상적으로는 이러한 테이블에 필터를 추가하여 원하지 않는 행을 제거함으로써이를 처리 할 수 ​​있어야합니다. 데이터 품질은 유효한 규칙이 없음을 가난 그러나, 만약 당신이 distinct에 후퇴해야합니다 :

with cte as ( 
    select t1.id 
     , t1.col1 as t1_col1 
     , t1.col2 as t1_col2 
      , t2.col1 as t2_col1 
      , t3.col1 as t3_col1 
    from t1 
     join (select distinct id, col1 from t2) t2 on t1.id = t2.id 
     join (select distinct id, col1 from t3) t3 on t1.id = t3.id 
) ... 
+0

데이터에서 다른 시나리오가 발생했습니다. 일부 ID는 T2 및 T3에서 동일한 값을 가지며 dups로 표시됩니다. – Skn

+0

ID 3과 6을 확인하십시오. 3과 6은 본인의 요건에 따라 중복되지 않습니다. – Skn

0

당신은 GROUP BY 절에서 모든 열을 추가 할 수있는 당신이 중복을 찾으려하고 다음 클로스에게 샘플 데이터의 경우

select t1.id,t1.col1,t2.col2,t2.col3,t3.col4 from t1 join t2 on t1.id=t2.id join t3 on t3.id=t1.id where (t1.col1,t2.col2,t2.col3,t3.col4) in (
    select t1.col1,t2.col2,t2.col3,t3.col4 
    from t1 join t2 on t1.id=t2.id join t3 on t3.id=t1.id 
    group by t1.col1,t2.col2,t2.col3,t3.col4 
    having count(*) >1 ) 
+0

여러 테이블을 조인 할 때의 문제를 건너 뛰었습니다. 이는 솔루션에서 데이터의 추가 주름을 처리 할 수 ​​없음을 의미합니다. – APC

+0

@APC OP는 처음에는 테이블을 언급하지 않았고, 거의 2 시간 후에 변경했습니다. 어쨌든 그에 따라 바꿀 것입니다. – Rams

0

있는에서 카운트 조건을 쓰기이 inner join-ing 세 개의 테이블을 사용하여 원하는 결과를 얻기 위해 아래와 같이 단지 group by tA.Col1 having count(tA.Col1)>1에서 where 절 서브 쿼리를 사용하여 얻을 수 있습니다.

SELECT t1.ID, 
     t1.Col1, 
     t1.Col2, 
     t2.Col1, 
     t3.Col1 
FROM table1 t1 
JOIN table2 t2 ON t1.ID = t2.ID 
JOIN table3 t3 ON t1.ID = t3.ID 
WHERE t1.Col1 IN 
    (SELECT tA.Col1 
    FROM table1 tA 
    GROUP BY tA.Col1 
    HAVING count(tA.Col1)>1) 
ORDER BY t1.ID; 

당신은 데모 here

이 도움이 될 것입니다 희망을 확인할 수 있습니다

ID Col1 Col2 Col1 Col1 
----------------------------------- 
1 A  US  Apple Spinach 
2 B  FR  Pear Celery 
4 B  FR  Pear Celery 
5 A  US  Apple Spinach 

결과.

+0

이 솔루션은't1.col1'과't1 사이에 확고한 의존성이있는 경우에만 유효합니다 . 콜 2. 게시 된 샘플 테스트 데이터에 적용되지만 실제 데이터에 적용된다는 가정을하고 있음에 동의합니다. – APC

+0

@APC : 그 이유는 첫 번째 대답은 "샘플 데이터"입니다 :-) – zarruq

관련 문제