2013-01-23 5 views
2

동일한 구조의 두 테이블이 있습니다.
두 행의 모든 ​​행이 같은지 어떻게 확인할 수 있습니까?
즉 첫 번째 테이블의 각 행이 다른 테이블에 있고 그 반대의 경우도 마찬가지입니다.두 테이블이 같은지 확인하십시오.

답변

0

이것은 흥미로운 것입니다. 나는이 작업을 수행 할 수있는 더 나은 또는 간단한 방법이 있다면 모르겠지만 이런 식으로 뭔가를 작동 할 수 있습니다 :

당신이 두 개의 테이블 T1과 T2를 가정하면, 그들은 각각 두 개의 C1 열 및 C2

create view t1_counts 
as select c1, c2, count(*) as num 
from t1 
group by c1, c2; 

create view t2_counts 
as select c1, c2, count(*) as num 
from t2 
group by c1, c2; 

select t1_counts.c1, t1_counts.c2, t1_counts.num, t2_counts.num 
from t1_counts full outer join t2_counts on (t1_counts.c1 = t2_counts.c1 and t1_counts.c2 = t2_counts.c2) 
where t1_counts.num != t2_counts.num; 

두 테이블이 동일하면 출력이 비어 있습니다.

1

제프의 블로그에서 나온 해결책은 하이브와 관련이 있습니다. http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx.

"기본 아이디어는 다음과 같습니다. 우리가 모든 열에 대해 두 테이블의 합집합을 만들면 두 테이블이 동일하면 모든 그룹의 수가 COUNT (*)가 2가됩니다. GROUP BY 절의 모든 열과 완전히 일치하지 않는 경우 COUNT (*)는 1이 될 것이고 우리가 원하는 것입니다. 또한 UNION의 각 부분에 열을 추가하여 각 행이 어느 테이블에 있는지 알려줄 필요가 있습니다 에서 그렇지 않으면 어떤 행이 어떤 표에서 왔는지 구별 할 방법이 없습니다. "

중복을 처리하기위한 개선 된 솔루션은 주석으로 게시 : http://weblogs.sqlteam.com/jeffs/archive/2004/11/10/2737.aspx#3155이 (는 댓글이 사용자 "페리"에 의해 원래 배치에서와 같이 코드를 재현)

SELECT MIN(TableName) as TableName, COL1, COL2, COL3 ... 
    FROM 
    (
    SELECT 'Table A' as TableName, COUNT(*) NDUPS, A.COL1, A.COL2, A.COL3, ... 
    FROM Table1 A GROUP BY ID, COL1, COL2, COL3 ... 
    UNION ALL 
    SELECT 'Table B' as TableName, COUNT(*) NDUPS, B.COL1, B.COl2, B.COL3, ... 
    FROM Table2 B 
    GROUP BY ID, COL1, COL2, COL3 ... 
    ) tmp 
    GROUP BY NDUPS, ID, COL1, COL2, COL3 ... 
    HAVING COUNT(*) = 1 
    ORDER BY ID 
+0

당신이 요약을 게시 할 수 있습니다 각 링크마다? 링크가 끊어지면 정보가 손실되지 않습니다. – fxm

관련 문제