2010-12-23 3 views
4

Oracle에서 구조적으로 동일한 두 테이블간에 "diff"를 수행하는 가장 좋은 방법은 무엇입니까? 그들은 서로 다른 두 가지 스키마 (서로 볼 수 있음)에 있습니다.Oracle의 테이블 "Diff"

감사합니다,

+2

PLSQL 개발자와 같은 도구가 있습니까? 그것은 '테이블 데이터 비교'기능을 가지고 있습니다. – GolezTrol

답변

4

당신이 PLSQL 개발자와 같은 도구가없는 경우, 당신은 완전 외부 두 테이블을 조인 할 수있다. 기본 키가있는 경우 조인에서이를 사용할 수 있습니다. 이렇게하면 두 테이블 중 누락 된 레코드에 대한 즉석보기가 제공됩니다. 그런 다음 두 테이블에 존재하는 레코드의 경우 각 필드를 비교할 수 있습니다. 널 (null)을 일반 = 연산자와 비교할 수 없으므로 table1.field1 = table2.field1은 두 필드가 모두 널인 경우 false를 리턴합니다. 따라서 각 필드가 다른 테이블과 동일한 값을 갖거나 둘 다 null 인 경우 각 필드를 확인해야합니다.

귀하의 질의는 다음과 같을 수 (일치하지 않는 레코드를 반환하는) :

select 
    * 
from 
    table1 t1 
    full outer join table2 t2 on t2.id = t1.id 
where 
    -- Only one record exists 
    t1.id is null or t2.id is null or 
    (-- The not = takes care of one of the fields being null 
    not (t1.field1 = t2.field1) and 
    -- and they cannot both be null 
    (t1.field1 is not null or t2.field1 is not null) 
) 

당신은 당신의 각 필드에 대한 그 필드 1 조건을 복사해야합니다. 물론 쿼리를 쉽게 수행 할 수 있도록 필드 데이터를 비교하는 함수를 작성할 수 있지만 큰 테이블 두 개를 비교해야하는 경우 성능이 크게 저하 될 수 있습니다.

테이블에 기본 키가없는 경우 테이블을 교차 결합하여 각 결과 레코드에 대해 이러한 검사를 수행해야합니다. 각 필수 필드에서 전체 외부 조인을 사용하면 약간의 속도가 빨라질 수 있는데, 이는 null 일 수 없으므로 조인에 사용할 수 있기 때문입니다.

4

당신이 두 테이블의 데이터 (전체 행에 DIFF)를 비교하려는 가정 :

SELECT * 
    FROM (SELECT 's1.t' "Row Source", a.* 
      FROM (SELECT col1, col2 
        FROM s1.t tbl1 
        MINUS 
        SELECT col1, col2 
        FROM s2.t tbl2) a 
      UNION ALL 
      SELECT 's2.t', b.* 
      FROM (SELECT col1, col2 
        FROM s2.t tbl2 
        MINUS 
        SELECT col1, col2 
        FROM s1.t tbl1) b) 
ORDER BY 1; 

info 두 테이블을 비교하는 약.